¿Qué es una operación idempotente?

¿Qué es una operación idempotente?

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 donde f (f (x)) = f (x) . Por ejemplo, la función abs() es idempotente porque abs(abs(x)) = abs(x) para todo x .

Estas definiciones ligeramente diferentes se pueden conciliar al considerar 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 el set Python y su método de discard . El método de discard elimina un elemento de un conjunto y no hace nada si el elemento no existe. Asi que:

 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 de Idempotent se utilizan a menudo en el diseño de protocolos de red, donde se garantiza que una solicitud para realizar una operación ocurra al menos una vez, pero también puede ocurrir más de una vez. Si la operación es idempotente, no hay daño en realizar la operación dos o más veces.

Vea el artículo de Wikipedia sobre idempotence para más información.


La respuesta anterior 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.

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

Idempotence se habla mucho en el contexto de los servicios web “RESTful”. REST busca aprovechar al máximo HTTP para dar acceso a los progtwigs al contenido web, y generalmente se establece en contraste con los servicios web basados ​​en SOAP, que simplemente canalizan los servicios de estilo de llamadas a procedimientos remotos 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 usa 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 obtienes una representación de un recurso REST (por ejemplo, GET una imagen jpeg de Flickr), y la operación falla, puedes simplemente repetir el GET 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 borrarlo una vez. Por lo tanto, Idempotence hace que sea mucho más fácil construir un servicio web que sea resistente a los errores de comunicación.

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

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

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.
  • Estableciendo un indicador booleano. No importa cuántas veces lo hagas, la bandera permanece establecida.
  • Eliminar una fila de una base de datos con una identificación dada. Si vuelves a intentarlo, la fila aún no está.

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 las funciones con efectos secundarios , idempotency implica además que no se causarán efectos secundarios adicionales después de la primera aplicación. Puede considerar el estado del mundo como un parámetro “oculto” adicional para la función si lo desea.

Tenga en cuenta que en un mundo en el que tiene acciones simultáneas, puede encontrar que las operaciones que pensó que eran idempotentes dejan de serlo (por ejemplo, otro hilo podría desarmar el valor de la bandera booleana en el ejemplo anterior). Básicamente, siempre que tenga simultaneidad y estado variable, 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 manejador de mensajes actúe como una operación idempotente para que el efecto del mensaje solo se produzca una vez.

Una operación idempotente produce el resultado en el mismo estado incluso si lo llama más de una vez, siempre que pase los mismos parámetros.

Solo quería arrojar un caso de uso real que demuestre idempotencia. En JavaScript, supongamos que está definiendo un grupo de clases modelo (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; } 

Podrías definir nuevas clases como esta:

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

Pero si tratara de obtener la clase de User través del model('user') , desde otro lugar en el código, fallaría:

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

Esos dos constructores de User 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 hiciste el model('user') será el mismo objeto, por lo que es idempotente. Asi que:

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

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 idóneas: 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

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 única como absolute (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á el mismo conjunto.

aclamaciones

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):

NULLIPOTENT: si una operación no tiene efectos secundarios, como mostrar información puramente 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 nullipotent. De lo contrario, use POST.

IDEMPOTENT: un mensaje en un sistema de mensajería de correo electrónico se abre y se marca como “abierto” en la base de datos. Se puede abrir el mensaje muchas veces, pero esta acción repetida solo dará como resultado que el mensaje esté en el estado “abierto”. Esta es una operación idempotente.

NO IDEMPOTENT: si una operación siempre causa un cambio en el estado, como POST enviar 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 IDEMPOTENT.

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

Muy detalladas y respuestas técnicas. Solo agregando una definición simple.

Idempotent = Re-runnable

Por ejemplo, no se garantiza que la operación Create en sí misma se ejecute sin error si se ejecuta más de una vez. Pero si hay una operación CreateOrUpdate entonces indica re-runnability (Idempotency).

Es cualquier operación que 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 recursión?

Métodos idempotentes

Un método idempotente es un método que producirá los mismos resultados independientemente de cuántas veces se lo llame.

  • El método GET es idempotente, ya que las llamadas múltiples al recurso GET siempre devolverán la misma respuesta.

  • El método PUT es idempotente, ya que llamar al método PUT varias veces actualizará el mismo recurso y no cambiará el resultado.

  • El POST no es idempotente, y llamar al método POST varias veces puede tener resultados diferentes y dará como resultado la creación de nuevos recursos.

  • El DELETE es idempotente porque una vez que se elimina el recurso, se va y llamar al método varias veces no cambiará el resultado.

mi 5c: en la integración y la creación de redes, 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 objective es idempotente, el resultado no será diferente. Si el sistema de destino depende del orden correcto en la secuencia, debemos implementar resequencer en el sitio de destino, lo que restablecería el orden correcto. 2. ¿Qué pasaría si hay mensajes duplicados? Si el canal del sistema de destino no confirma oportunamente, el sistema de origen (o el canal mismo) generalmente envía otra copia del mensaje. Como resultado, podemos tener un mensaje duplicado en el lado del sistema de destino. Si el sistema objective es idempotente, se ocupa de él 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.

Desde un punto de vista de servicio RESTful, para que una operación (o llamada de servicio) sea idempotente, los clientes pueden hacer esa misma llamada repetidamente mientras producen el mismo resultado. En otras palabras, hacer múltiples solicitudes idénticas tiene el mismo efecto que realizar una única solicitud. Tenga en cuenta que aunque las operaciones idempotentes producen el mismo resultado en el servidor (sin efectos secundarios), la respuesta en sí misma puede no ser la misma (por ejemplo, el estado de un recurso puede cambiar entre las solicitudes).

GET representa una operación idempotente, de solo lectura. Puede enviar una solicitud GET a un servidor repetidamente sin efectos nocivos, porque un GET no cambia (o no debería) el estado en el servidor.

Un POST, por otro lado, es el tipo de solicitud que utiliza para enviar una transacción de tarjeta de crédito, agregar un álbum a un carrito de compras o cambiar una contraseña. Una solicitud POST generalmente modifica el estado en el servidor, y la repetición de la solicitud puede producir efectos no deseados (como la doble facturación). Muchos navegadores ayudan a un usuario a evitar repetir una solicitud POST.

Las aplicaciones web generalmente usan solicitudes GET para lecturas y solicitudes POST para escrituras (que generalmente incluyen actualizaciones, creaciones y eliminaciones). Una solicitud para pagar por música usa POST. Una solicitud para buscar música, un escenario que mira a continuación, utiliza GET.

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

Por ejemplo, según la definición de la especificación de HTTP, GET, HEAD, PUT, and DELETE son operaciones idempotentes; sin embargo POST and PATCH no lo son. Es por eso que a veces POST es reemplazado por PATCH.

reintentar-seguro.

Por lo general, es la forma más fácil de comprender su significado en ciencias de la computación.

    Intereting Posts