Pregunta

¿Qué es una operación idempotente?

¿Fue útil?

Solución

En informática, una operación idempotente es uno que no tiene ningún 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 se puede considerar una operación idempotente en el set.

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

Estas definiciones ligeramente diferentes pueden reconciliarse al considerar 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 método discard . El método <=> elimina un elemento de un conjunto, y no hace nada si el elemento no existe. Por lo tanto:

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)

Idempotent operaciones se utilizan a menudo en el diseño de protocolos de red, cuando una solicitud para realizar una operación está garantizada a pasar al menos una vez, pero también podrían ocurrir más de una vez. Si la operación es idempotente, entonces no hay ningún daño en la realización de la operación dos o más veces.

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


La respuesta anterior previamente había algunos ejemplos incorrectas y engañosas. Comentarios a continuación por escrito antes de abril de 2014 se refieren a una versión anterior.

Otros consejos

Una operación idempotente se puede repetir un número arbitrario de veces y el resultado será el mismo que si se hubiera hecho sólo una vez.En aritmética, sumar 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 brindar a los programas acceso al contenido web y, por lo general, se establece en contraste con los servicios web basados ​​en SOAP, que simplemente canalizan servicios de estilo de llamada a procedimiento remoto dentro de 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 OBTIENE una representación de un recurso REST (por ejemplo, OBTIENE una imagen jpeg de Flickr) y la operación falla, puede repetir 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.De manera similar, ELIMINAR un recurso REST mil veces es lo mismo que eliminarlo una vez.Por lo tanto, la idempotencia hace que sea mucho más fácil construir un servicio web que sea resistente a los errores de comunicación.

Otras lecturas: Servicios web RESTful, de Richardson y Ruby (la idempotencia se analiza en las páginas 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.

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

Idempotencia significa que aplicar una operación una vez o 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 puesta.
  • Eliminar una fila de una base de datos con una ID determinada.Si lo intentas de nuevo, la fila aún desaparecerá.

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 producirá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 de la función.

Tenga en cuenta que en un mundo donde tiene acciones concurrentes, es posible que las operaciones que pensaba que eran idempotentes dejen de serlo (por ejemplo, otro hilo podría anular 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 en la idempotencia.

La idempotencia suele ser una propiedad útil en la construcción de sistemas robustos.Por ejemplo, si existe el riesgo de recibir 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.

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

Sólo quería echar a un caso de uso real que demuestra idempotencia. En JavaScript, digamos que está definiendo un montón de clases del modelo (como en el modelo MVC). La forma en que se implementa a menudo es funcionalmente equivalente a algo como esto (ejemplo básico):

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

  return Model;
}

A continuación, podría definir nuevas clases de esta manera:

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

Pero si tuviera que tratar de conseguir a través de la clase User model('user'), de otra parte en el código, sería un error:

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

Los dos constructores <=> serían diferentes. Es decir,

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

Para que sea idempotente , que acaba de añadir algún tipo de mecanismo de caché, así:

var collection = {};

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

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

  collection[name] = Model;
  return Model;
}

Mediante la adición de almacenamiento en caché, cada vez que lo hizo <=> será el mismo objeto, y lo que es idempotente. Por lo tanto:

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

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 (WEB APP contexto):

idempotente: Cómo hacer varias solicitudes idénticas tiene el mismo efecto que hacer una sola petición. 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 referida solamente como resultado que el mensaje está en el estado "abierto". Esta es una operación idempotente. La primera vez que uno pone una actualización de un recurso utilizando la información que no coincide con el recurso (el estado del sistema), el estado del sistema cambiará a medida que el recurso se actualiza. Si uno pone la misma actualización de un recurso en repetidas ocasiones a continuación, la información de la actualización coincidirá con la ya presente en el sistema a cada PUT, y no se producirá ningún cambio en el estado del sistema. PUT repetidos con la misma información son idempotente: la primera PUT puede cambiar el estado del sistema, pone posteriores no deberían hacerlo.

NO idempotente: Si una operación siempre provoca un cambio de estado, al igual que la publicación de la misma 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 que, se dice que la operación es NO idempotente.

NULLIPOTENT: Si una operación no tiene efectos secundarios, como muestra puramente información en una página web sin ningún cambio en una base de datos (en otras palabras, sólo leyendo la base de datos), decimos que la operación es NULLIPOTENT. Todo se debe ser nullipotent.

Cuando se habla del estado del sistema, obviamente, estamos ignorando los efectos de esperar inofensivos e inevitables como la tala y el diagnóstico.

Operaciones Idempotent: Las operaciones que no tiene efectos secundarios si se ejecuta varias veces.
Ejemplo : Una operación que recupera los valores de un recurso de datos y decir, lo imprime
No-Idempotent Operaciones: Las operaciones que pudieran causar algún daño si se ejecuta varias veces. (A medida que cambian algunos valores o estados)
Ejemplo: Una operación que se retira de una cuenta bancaria

Bastantes detalladas y técnicas respuestas. Simplemente añadiendo una definición simple.

  

idempotente = Re-runnable

Por ejemplo, Create operación en sí mismo no se garantiza la ejecución sin error si se ejecuta más de una vez. Pero si hay una operación CreateOrUpdate entonces se declara re-operabilidad (idempotencia).

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 absoluto (x) donde x pertenece a un conjunto de números enteros positivos. Aquí absoluto (absoluto (x)) = x.

Puede ser una operación binaria como unión de un conjunto consigo mismo que siempre devuelven el mismo conjunto.

aplausos

Es cualquier operación que cada resultado enésima dará lugar a una salida que coincida con el valor de la primera consecuencia. 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.

Vea también: ¿Cuándo sería un momento muy tonto para usar recursividad

?

mi 5c: En la integración de redes y la idempotencia es muy importante. Varios ejemplos de la vida real: Imaginemos, entregamos los datos al sistema de destino. Los 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 de destino es idempotente, el resultado no será diferente. Si el sistema de destino depende del orden correcto en la secuencia, tenemos que implementar resecuenciador en el sitio de destino, que restauraría el orden correcto. 2. ¿Qué pasaría si no son los duplicados de mensajes? Si el canal del sistema de destino no reconoce a tiempo, el sistema de origen (o canal de sí mismo) por lo general envía otra copia del mensaje. Como resultado podemos tener mensaje duplicado en el lado sistema de destino. Si el sistema de destino es idempotente, que se encarga de ello y el resultado no será diferente. Si el sistema de destino no es idempotente, tenemos que implementar Deduplicator en el lado sistema de destino del canal.

En resumen , las operaciones Idempotent significa que la operación no dará lugar a resultados diferentes, no importa cuántas veces usted opera las operaciones idempotente.

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. Por eso a veces se sustituye por la POST parche.

retry-seguro.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top