¿Qué es una operación idempotente?


Respuestas:


964

En informática, una operación idempotente es aquella que no tiene ningún efecto adicional si se llama más de una vez con los mismos parámetros de entrada. Por ejemplo, eliminar un elemento de un conjunto puede considerarse una operación idempotente en el conjunto.

En matemáticas, una operación idempotente es aquella en la que f (f (x)) = f (x) . Por ejemplo, la abs()función es idempotente porque abs(abs(x)) = abs(x)para todos x.

Estas definiciones ligeramente diferentes se pueden conciliar considerando que x en la definición matemática representa el estado de un objeto, yf es una operación que puede mutar ese objeto. Por ejemplo, considere Pythonset y su discardmétodo. El discardmétodo elimina un elemento de un conjunto y no hace nada si el elemento no existe. Entonces:

my_set.discard(x)

tiene exactamente el mismo efecto que hacer la misma operación dos veces:

my_set.discard(x)
my_set.discard(x)

Las operaciones idempotentes a menudo se usan en el diseño de protocolos de red, donde se garantiza que una solicitud para realizar una operación se realice al menos una vez, pero también puede ocurrir más de una vez. Si la operación es idempotente, entonces no hay daño en realizar la operación dos o más veces.

Consulte el artículo de Wikipedia sobre idempotencia para obtener más información.


La respuesta anterior anteriormente tenía algunos ejemplos incorrectos y engañosos. Los comentarios a continuación escritos antes de abril de 2014 se refieren a una revisión anterior.


66
Ejemplo: dado que la respuesta anterior indica que Idempotent operations are often used in the design of network protocolsaquí hay un ejemplo relacionado ** Se supone que GET no cambia nada en el servidor, por lo que GET es idempotente. En el contexto HTTP / servlet, significa que la misma solicitud se puede hacer dos veces sin consecuencias negativas. ** POST NO es idempotente.
KNU

1
¿"Apátrida" es sinónimo de "idempotente"?
Michael Osofsky

2
@MichaelOsofsky: No, en el setejemplo de Python en la respuesta, el objeto establecido claramente tiene estado y también ofrece algunas operaciones idempotentes como discard.
Greg Hewgill

1
@MichaelOsofsky, discardtambién puede ser implementado de una manera sin estado, al abarcar el estado en el valor de retorno: discard([my_set, x]) = [my_new_set, x]. Entonces puedes hacerlo discard(discard([my_set, x])). Tenga en cuenta que [my_new_set, x]es solo un argumento y su tipo es de 2 tuplas.
Pacerier

2
@Verde Cuando se usa el término mismo efecto en el contexto de impotencia, significa que el resultado es el mismo, no la acción . Llamar discard(x)una segunda vez tendrá el mismo efecto que llamar la primera vez: el conjunto ya no contendrá x. La idempotencia informática se trata de la solidez de un sistema. Dado que las cosas pueden fallar (por ejemplo, corte de red), cuando se detecta una falla, ¿cómo se recupera? La recuperación más fácil es volver a hacerlo, pero eso solo funciona si hacerlo de nuevo es idempotente. Por ejemplo, discard(x)es idempotente, pero pop()no lo es. Se trata de recuperación de errores.
Andreas

138

Una operación idempotente puede repetirse un número arbitrario de veces y el resultado será el mismo que si se hubiera hecho solo una vez. En aritmética, agregar cero a un número es idempotente.

Se habla mucho de idempotencia en el contexto de los servicios web "RESTful". REST busca aprovechar al máximo HTTP para dar acceso a los programas al contenido web, y generalmente se establece en contraste con los servicios web basados ​​en SOAP, que solo hacen un túnel de los servicios de estilo de llamada de procedimiento remoto dentro de las solicitudes y respuestas HTTP.

REST organiza una aplicación web en "recursos" (como un usuario de Twitter o una imagen de Flickr) y luego utiliza los verbos HTTP de POST, PUT, GET y DELETE para crear, actualizar, leer y eliminar esos recursos.

La idempotencia juega un papel importante en REST. Si OBTENES una representación de un recurso REST (p. Ej., OBTENES una imagen jpeg de Flickr), y la operación falla, puedes repetir el OBTENER una y otra vez hasta que la operación tenga éxito. Para el servicio web, no importa cuántas veces se obtenga la imagen. Del mismo modo, si utiliza un servicio web RESTful para actualizar la información de su cuenta de Twitter, puede PONER la nueva información tantas veces como sea necesario para obtener la confirmación del servicio web. PONERLO mil veces es lo mismo que PONERLO una vez. Del mismo modo, ELIMINAR un recurso REST mil veces es lo mismo que eliminarlo una vez. La idempotencia hace que sea mucho más fácil construir un servicio web que sea resistente a los errores de comunicación.

Lecturas adicionales: RESTful Web Services , de Richardson y Ruby (la idempotencia se discute en la página 103-104), y la tesis doctoral de Roy Fielding sobre REST . Fielding fue uno de los autores de HTTP 1.1, RFC-2616, que habla sobre idempotencia en la sección 9.1.2 .


Claro y directo. Sin embargo, esta es solo una interpretación de idempotente.
Pacerier

10
"idempotencia" es una palabra muy sobrecargada porque suena grandilocuente y tiene suficientes caracteres para pasar el cheque sesquipedaliano. Si Benjamin Peirce hubiera elegido una palabra que suene más simple, ni siquiera tendríamos esta pregunta hoy.
Pacerier

2
Cómo entenderlo: de forma similar, ELIMINAR un recurso REST mil veces es lo mismo que eliminarlo una vez . No puede eliminar el recurso nuevamente si ya está eliminado.
Verde

1
@Green pero no lo eliminas la primera vez. Usted envía una solicitud de eliminación . El punto importante es que puede enviar tantas solicitudes como desee.
Caleth

1
@JimFerrans Ya veo. Pensé que podría haber alguna razón relacionada con la funcionalidad (integrada en el propio HTTP) de por qué PUT se puede reenviar sin preocupaciones, mientras que POST no. Ahora parece que simplemente debemos cumplir con los estándares HTTP y el comportamiento se basa totalmente en cómo se implementa el servidor
mangusta

109

No importa cuántas veces llame a la operación, el resultado será el mismo.


8
He escuchado idempotentes definidos como uno o ambos de los siguientes: 1) Para un conjunto dado de entradas, siempre devolverá la misma salida. 2) No produce ningún efecto secundario. Mi pregunta es, si una función cumple con el n. ° 1, pero no con el n. ° 2, porque resulta en un efecto secundario no relacionado con el cómputo (por ejemplo, registra la solicitud en un almacén de datos), ¿todavía se considera idempotente?
Keith Bennett

12
El resultado de llamar a una operación debe incluir el estado del sistema, por lo que si la operación tiene algún efecto secundario acumulativo, no es idempotente; sin embargo, si el efecto secundario deja el sistema en el mismo estado, no importa cuántas veces se llame la operación, entonces puede ser idempotente.
Robert

44
Corto y dulce, me encanta ese tipo de respuesta. No estoy seguro de por qué tengo que buscar este término constantemente, es uno que simplemente no se queda conmigo.
Prancer

1
@KeithBennett, la segunda definición es incorrecta. "Sin efecto secundario" no significa idempotente. Las funciones idempotentes pueden tener efectos secundarios. Por ejemplo, MySQL truncatey delete.
Pacerier

El resultado será el mismo (es decir, el estado del sistema), pero la respuesta puede variar (es decir, los códigos de estado HTTP en un servicio REST).
G. Steigert

50

Idempotencia significa que aplicar una operación una vez o aplicarla varias veces tiene el mismo efecto.

Ejemplos:

  • Multiplicación por cero. No importa cuántas veces lo hagas, el resultado sigue siendo cero.
  • Establecer una bandera booleana. No importa cuántas veces lo hagas, la bandera permanece fija.
  • Eliminar una fila de una base de datos con una ID dada. Si lo intentas de nuevo, la fila aún desaparece.

Para funciones puras (funciones sin efectos secundarios), entonces la idempotencia implica que f (x) = f (f (x)) = f (f (f (x))) = f (f (f (f (x))) ) = ...... para todos los valores de x

Para funciones con efectos secundarios. , la idempotencia implica además que no se causarán efectos secundarios adicionales después de la primera aplicación. Si lo desea, puede considerar el estado del mundo como un parámetro "oculto" adicional para la función.

Tenga en cuenta que en un mundo en el que tiene acciones concurrentes en curso, es posible que las operaciones que creía que eran idempotentes dejaran de serlo (por ejemplo, otro hilo podría desarmar el valor de la bandera booleana en el ejemplo anterior). Básicamente, siempre que tenga concurrencia y estado mutable, debe pensar mucho más detenidamente sobre la idempotencia.

La idempotencia es a menudo una propiedad útil en la construcción de sistemas robustos. Por ejemplo, si existe el riesgo de que reciba un mensaje duplicado de un tercero, es útil que el controlador de mensajes actúe como una operación idempotente para que el efecto del mensaje solo ocurra una vez.


1
Si se trata de funciones puras f(x) = f(f(x)), ¿quiere decir que f(x){return x+1;}no es una función pura? porque f(x) != f(f(x)): f(1)da 2 mientras f(2)da 3.
Pacerier

1
@Pacerier No, @mikera dice que implica puro e idempotente f(x) = f(f(x)). Pero como mencionó @GregHewgill, para que esta definición tenga sentido, debe considerarse xcomo un objeto y fcomo una operación que muta el estado del objeto (es decir, la salida de fes mutada x).
Justin J Stark


16

Solo quería lanzar un caso de uso real que demuestre idempotencia. En JavaScript, supongamos que está definiendo un grupo de clases de modelos (como en el modelo MVC). La forma en que esto se implementa a menudo es funcionalmente equivalente a algo como esto (ejemplo básico):

function model(name) {
  function Model() {
    this.name = name;
  }

  return Model;
}

Luego podría definir nuevas clases como esta:

var User = model('user');
var Article = model('article');

Pero si intentara obtener la Userclase a través de model('user'), desde otro lugar del código, fallaría:

var User = model('user');
// ... then somewhere else in the code (in a different scope)
var User = model('user');

Esos dos Userconstructores serían diferentes. Es decir,

model('user') !== model('user');

Para hacerlo idempotente , simplemente agregaría algún tipo de mecanismo de almacenamiento en caché, como este:

var collection = {};

function model(name) {
  if (collection[name])
    return collection[name];

  function Model() {
    this.name = name;
  }

  collection[name] = Model;
  return Model;
}

Al agregar el almacenamiento en caché, cada vez que model('user')lo haga será el mismo objeto, por lo que es idempotente. Entonces:

model('user') === model('user');

10

Una operación idempotente es una operación, acción o solicitud que se puede aplicar varias veces sin cambiar el resultado, es decir, el estado del sistema, más allá de la aplicación inicial.

EJEMPLOS (CONTEXTO DE LA APLICACIÓN WEB):

IDEMPOTENTE: Hacer múltiples solicitudes idénticas tiene el mismo efecto que hacer una sola solicitud. Un mensaje en un sistema de mensajería de correo electrónico se abre y se marca como "abierto" en la base de datos. Uno puede abrir el mensaje muchas veces, pero esta acción repetida solo resultará en que ese mensaje esté en el estado "abierto". Esta es una operación idempotente. La primera vez que se PONE una actualización de un recurso utilizando información que no coincide con el recurso (el estado del sistema), el estado del sistema cambiará a medida que se actualice el recurso. Si uno pone la misma actualización a un recurso repetidamente, entonces la información en la actualización coincidirá con la información que ya está en el sistema en cada PUT, y no se producirá ningún cambio en el estado del sistema. Los PUT repetidos con la misma información son idempotentes:

NO IDEMPOTENTE: si una operación siempre causa un cambio de estado, como PUBLICAR el mismo mensaje a un usuario una y otra vez, lo que resulta en un nuevo mensaje enviado y almacenado en la base de datos cada vez, decimos que la operación NO ES IDEMPOTENTE.

NULLIPOTENT: si una operación no tiene efectos secundarios, como simplemente mostrar información en una página web sin ningún cambio en una base de datos (en otras palabras, solo está leyendo la base de datos), decimos que la operación es NULLIPOTENT. Todos los GET deben ser nulipotentes.

Cuando hablamos del estado del sistema, obviamente ignoramos los efectos inofensivos e inevitables como el registro y el diagnóstico.


9

Operaciones Idempotentes: Operaciones que no tienen efectos secundarios si se ejecutan varias veces.
Ejemplo : una operación que recupera valores de un recurso de datos y, por ejemplo, lo imprime

Operaciones no idempotentes: operaciones que causarían algún daño si se ejecutan varias veces. (A medida que cambian algunos valores o estados)
Ejemplo: una operación que se retira de una cuenta bancaria


3
En realidad una respuesta incorrecta! para la operación Idempotente decir "no tener efectos secundarios" no es correcto. para las operaciones no idempotentes decir "causar algún daño" es una respuesta confusa.
Saeed Mohtasham

9

Bastante detallado y respuestas técnicas. Solo agrego una definición simple.

Idempotente = Re-ejecutable

Por ejemplo, Createno se garantiza que la operación en sí misma se ejecute sin error si se ejecuta más de una vez. Pero si hay una operación, CreateOrUpdateentonces indica la repetibilidad (Idempotency).


3
Esta es una definición engañosa. la repetibilidad no garantiza ser idempotente. Una operación puede volver a ejecutarse y en cada ejecución puede agregar efectos adicionales al resultado para que no sea idempotente.
Saeed Mohtasham

7

Una operación idempotente sobre un conjunto deja a sus miembros sin cambios cuando se aplica una o más veces.

Puede ser una operación unaria como absoluta (x) donde x pertenece a un conjunto de enteros positivos. Aquí absoluto (absoluto (x)) = x.

Puede ser una operación binaria, como la unión de un conjunto consigo mismo siempre devolvería el mismo conjunto.

salud


Una operación idempotente es aquella donde f (f (x)) = f (x). "deja a sus miembros sin cambios" no es una respuesta correcta.
Saeed Mohtasham

7

En cualquier operación, cada enésimo resultado dará como resultado una salida que coincida con el valor del primer resultado. Por ejemplo, el valor absoluto de -1 es 1. El valor absoluto del valor absoluto de -1 es 1. El valor absoluto del valor absoluto del valor absoluto de -1 es 1. Y así sucesivamente.

Ver también: ¿Cuándo sería un momento realmente tonto para usar la recursividad?


1
Es una respuesta concisa incluso después de 10 años. +1
snr

3

Un buen ejemplo de comprensión de una operación idempotente podría ser bloquear un automóvil con llave remota.

log(Car.state) // unlocked

Remote.lock();
log(Car.state) // locked

Remote.lock();
Remote.lock();
Remote.lock();
log(Car.state) // locked

lockEs una operación idempotente. Incluso si hay algún efecto secundario cada vez que corre lock, como parpadear, el automóvil sigue en el mismo estado bloqueado, sin importar cuántas veces ejecute la operación de bloqueo.


1

Mi 5c: En integración y trabajo en red, la idempotencia es muy importante. Varios ejemplos de la vida real: Imagine, entregamos datos al sistema de destino. Datos entregados por una secuencia de mensajes. 1. ¿Qué pasaría si la secuencia se mezcla en el canal? (Como los paquetes de red siempre lo hacen :)). Si el sistema objetivo es idempotente, el resultado no será diferente. Si el sistema objetivo depende del orden correcto en la secuencia, tenemos que implementar resequencer en el sitio objetivo, lo que restauraría el orden correcto. 2. ¿Qué pasaría si hay mensajes duplicados? Si el canal del sistema de destino no reconoce oportunamente, el sistema de origen (o el propio canal) generalmente envía otra copia del mensaje. Como resultado, podemos tener mensajes duplicados en el lado del sistema de destino. Si el sistema objetivo es idempotente, lo cuida y el resultado no será diferente. Si el sistema de destino no es idempotente, tenemos que implementar el deduplicador en el lado del sistema de destino del canal.


La idempotencia de solicitudes individuales enviadas de forma aislada de cualquier otra solicitud (o cualquier otra cosa que cambie el estado del sistema) no es lo mismo que reordenar solicitudes. Una solicitud HTTP PUT y una solicitud HTTP DELETE deben ser idempotentes individualmente, pero eso no significa que el orden de llamar a PUT y DELETE en la misma URL no importe, ¡porque la solicitud PUT podría tener efectos secundarios!
Robin Green

1

En resumen , las operaciones idempotentes significan que la operación no generará resultados diferentes sin importar cuántas veces opere las operaciones idempotentes.

Por ejemplo, de acuerdo con la definición de la especificación de HTTP, GET, HEAD, PUT, and DELETEson operaciones idempotentes; Sin embargo POST and PATCHno lo son. Es por eso que a veces POSTse reemplaza por PUT.


-4

Vuelva a intentarlo.

Suele ser la forma más fácil de entender su significado en informática.


1
Reintentar implica algo que falló la primera vez o la anterior. No es lo mismo.
Lasse V. Karlsen

¿Quién editó mi pregunta y me consiguió un voto negativo? ¿Ese no es el texto que publiqué?
teknopaul

Puede consultar el registro de edición haciendo clic en el enlace debajo de su respuesta que dice "editado hace X horas" o similar.
Lasse V. Karlsen
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.