Respuestas:
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 discard
método. El discard
mé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.
set
ejemplo de Python en la respuesta, el objeto establecido claramente tiene estado y también ofrece algunas operaciones idempotentes como discard
.
discard
tambié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.
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.
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 .
No importa cuántas veces llame a la operación, el resultado será el mismo.
truncate
y delete
.
Idempotencia significa que aplicar una operación una vez o aplicarla varias veces tiene el mismo efecto.
Ejemplos:
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.
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.
f(x) = f(f(x))
. Pero como mencionó @GregHewgill, para que esta definición tenga sentido, debe considerarse x
como un objeto y f
como una operación que muta el estado del objeto (es decir, la salida de f
es mutada x
).
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 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 User
clase 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 User
constructores 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');
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.
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
Bastante detallado y respuestas técnicas. Solo agrego una definición simple.
Idempotente = Re-ejecutable
Por ejemplo,
Create
no 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, CreateOrUpdate
entonces indica la repetibilidad (Idempotency).
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
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?
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
lock
Es 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.
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.
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 DELETE
son operaciones idempotentes; Sin embargo POST and PATCH
no lo son. Es por eso que a veces POST
se reemplaza por PUT
.
Vuelva a intentarlo.
Suele ser la forma más fácil de entender su significado en informática.
Idempotent operations are often used in the design of network protocols
aquí 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.