¿Qué es una operación idempotent?


¿Qué es una operación idempotent?

Author: shA.t, 2009-07-03

15 answers

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

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

Estas definiciones ligeramente diferentes pueden conciliarse considerando que x en la definición matemática representa el estado de un objeto, y f es una operación que puede mutar ese objeto. Por ejemplo, considere la Python set y su discard método. El método discard 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 se utilizan a menudo en el diseño de protocolos de red, donde un la solicitud para realizar una operación está garantizada por lo 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.

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


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

 723
Author: Greg Hewgill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-01 19:41:52

Una operación idempotente se puede repetir 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.

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

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

La idempotencia juega un papel importante en el DESCANSO. Si OBTIENE una representación de un recurso REST (por ejemplo, OBTENER una imagen jpeg de Flickr), y la operación falla, puede repetir la OBTENCIÓN una y otra vez hasta que la operación tenga éxito. Al servicio web, se 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 colocar la nueva información tantas veces como sea necesario para obtener la confirmación del servicio web. Ponerla mil veces es lo mismo que ponerla una vez. Del mismo modo ELIMINAR un recurso REST mil veces es lo mismo que eliminarlo una vez. Por lo tanto, Idempotence hace que sea mucho más fácil construir un servicio web que sea resistente a la comunicación error.

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

 107
Author: Jim Ferrans,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-11 13:26:35

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

 79
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 17:19:03

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 una bandera booleana. No importa cuántas veces lo hagas, la bandera permanece fija.
  • Eliminar una fila de una base de datos con un ID dado. Si lo intentas de nuevo, la fila sigue desapareciendo.

Para funciones puras (funciones sin lado efectos) luego de 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, 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 a la función si lo desea.

Tenga en cuenta que en un mundo donde tiene acciones simultáneas, puede encontrar que las operaciones que thought were idempotent deja de ser así (por ejemplo, otro hilo podría desajustar el valor de la bandera booleana en el ejemplo anterior). Básicamente siempre que tenga concurrencia y estado mutable, necesita pensar mucho más cuidadosamente sobre idempotency.

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 ocurre una vez.

 41
Author: mikera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-05 08:40:33

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

 22
Author: Caleb Huitt - cjhuitt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-09 14:43:58

Solo quería descartar un caso de uso real que demuestre idempotencia. En JavaScript, digamos que está definiendo un montón de clases de 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;
}

Entonces podría definir nuevas clases como esta:

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

Pero si intentaras obtener la clase User a través de model('user'), de algún 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 User los constructores serían diferentes. Es decir,

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

Para hacerlo idempotente , simplemente agregarías 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 almacenamiento en caché, cada vez que lo haga model('user') será el mismo objeto, y por lo tanto es idempotente. Así que:

model('user') === model('user');
 10
Author: Lance Pollard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 01:30:44

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 dice, lo imprime

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

 8
Author: Mahmoud Abou-Eita,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-06 14:42:39

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

Puede ser una operación unaria 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ía el mismo conjunto.

Salud

 6
Author: Arnkrishn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 01:26:46

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 puramente 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. Todo GETs debe ser nullipotent. De lo contrario, utilice 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. Uno puede abrir el mensaje muchas veces, pero esta acción repetida solo resultará en que el mensaje esté en el estado" abierto". Esta es una operación idempotente.

NO IDEMPOTENTE: Si una operación siempre causa un cambio en el 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, digamos que la operación NO es IDEMPOTENTE.

Cuando hablamos del estado del sistema obviamente estamos ignorando, esperemos, efectos inofensivos e inevitables como el registro y el diagnóstico.

 6
Author: nmit026,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-07 02:48:01

Respuestas bastante detalladas y técnicas. Simplemente añadiendo una definición simple.

Idempotent = Re-runnable

Por ejemplo, Create la operación en sí misma no está garantizada para ejecutarse sin error si se ejecuta más de una vez. Pero si hay una operación CreateOrUpdate entonces los estados re-comportamiento (Idempotencia).

 6
Author: Manish Basantani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-13 10:59:41

Es cualquier operación que cada enésimo resultado dará como resultado una salida que coincida con el valor del 1er 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?

 5
Author: Oorang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-03 01:41:01

Métodos idempotentes

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

  • El método GET es idempotente, ya que múltiples llamadas 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.

  • POST no es idempotente, y llamando a la POST método varias veces puede tener diferentes resultados y dará lugar a la creación de nuevos recursos.

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

 5
Author: BERGUIGA Mohamed Amine,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-25 17:18:12

Mi 5c: En la integración y el trabajo en red la idempotencia es muy importante. Varios ejemplos de la vida real: Imagínese, 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 siempre hacen los paquetes de red:)). Si el sistema de destino es idempotent, el resultado no será diferente. Si el sistema de destino depende del orden correcto en la secuencia, tenemos que implementar resequencer en el sitio de destino, lo que haría restaure el orden correcto. 2. ¿Qué pasaría si hay duplicados de mensajes? Si el canal del sistema de destino no reconoce a tiempo, el sistema de origen (o el propio canal) generalmente envía otra copia del mensaje. Como resultado, podemos tener un mensaje duplicado en el lado del sistema de destino. Si el sistema de destino es idempotente, se encarga de él y el resultado no será diferente. Si el sistema de destino no es idempotente, tenemos que implementar deduplicator en el lado del sistema de destino de la canal.

 0
Author: Leonid Ganeline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-07 16:11:59

En resumen , las operaciones Idempotentes significan que la operación no dará lugar a 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 DELETE son operaciones idempotentes; sin embargo, POST and PATCH no lo son. Es por eso que a veces POST es reemplazado por PATCH.

 0
Author: Marcus Thornton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-25 08:50:07

Reintentar-seguro.

Es generalmente la forma más fácil de entender su significado en ciencias de la computación.

 -2
Author: teknopaul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-09 10:23:48