Seguramente alguna vez has pulsado el botón del ascensor y, por si acaso, lo has vuelto a pulsar varias veces. Si el botón ya está iluminado, pulsarlo de nuevo no hará que lleguen dos ascensores. En cambio, quizá alguna vez hayas pulsado dos veces el botón de una página de pago en línea y te hayas quedado con la duda de si te cobrarían dos veces. La idempotencia es el concepto que explica por qué la misma acción es segura en un caso y arriesgada en el otro.
La idempotencia (Idempotence) es la propiedad por la cual una acción produce el mismo resultado tanto si se realiza una sola vez como si se repite. Dicho de forma sencilla, «repetir algo que ya se hizo no amplía su efecto». Esta propiedad es especialmente importante en informática, donde es habitual que se interrumpan las conexiones y se dupliquen las solicitudes.
En este artículo veremos de dónde viene el nombre de la idempotencia, cómo distinguir los casos en la vida cotidiana, cómo incorpora HTTP este concepto a su especificación y cómo diseñar sistemas que gestionen de forma segura las solicitudes duplicadas. También repasaremos algunos malentendidos habituales.
Por qué algunas acciones tienen el mismo efecto al hacerlas una vez o dos
Un nombre que viene de las matemáticas y significa «la misma potencia»

Se atribuye el término al matemático estadounidense Benjamin Peirce, que lo acuñó en 1870 en un texto sobre álgebra asociativa lineal (Linear Associative Algebra). El término combina idem, que significa «igual», y potence, que significa «potencia», por lo que literalmente quiere decir «que tiene la misma potencia». Peirce dio este nombre a los objetos algebraicos que siguen siendo iguales a sí mismos al elevarlos al cuadrado o a una potencia superior.
(1) Definición matemática
Aplicar dos veces la función f da el mismo resultado que aplicarla una sola vez. Se escribe f(f(x)) = f(x).
(2) Ejemplos de funciones
El valor absoluto, la función de redondeo hacia abajo que descarta la parte decimal, la función de redondeo hacia arriba y la función identidad, que devuelve el valor de entrada tal como lo recibe, tienen esta propiedad.
(3) Significado en informática
Una operación se considera idempotente, incluso si tiene efectos secundarios, cuando el estado del sistema tras invocarla varias veces es el mismo que tras invocarla una sola vez.
El criterio es que el estado deje de cambiar tras la primera ejecución, aunque la respuesta pueda variar. Si se pasa por alto esta diferencia, es fácil confundir la idempotencia con otros conceptos.
Cómo distinguir las acciones idempotentes con botones de uso cotidiano

La primera vez que se pulsa el botón de llamada de un ascensor o el de un paso peatonal, la solicitud queda «pendiente». Volver a pulsarlo antes de que se atienda la solicitud no tiene ningún efecto. Con el botón de cierre también da igual cuántas veces se pulse, porque la puerta se cierra según el tiempo programado. En cambio, el botón de apertura no es idempotente, porque cada pulsación prolonga el tiempo de espera.
- Consulta (Lookup): leer el nombre y la dirección de un cliente es una operación idempotente porque los datos permanecen intactos.
- Asignación (Assignment): pedir que se cambie la dirección a un valor concreto es una operación idempotente, porque la dirección final es la misma aunque se repita la solicitud.
- Realización de pedidos (Order Placement): pedir que se haga un pedido es una operación no idempotente, porque se puede generar un pedido cada vez que se envía la solicitud.
- Cancelación (Cancellation): pedir que se cancele un pedido concreto es una operación idempotente, porque el pedido sigue cancelado por muchas veces que se envíe la solicitud.
Aunque el gesto sea el mismo, pulsar un botón, el resultado depende de si la acción fija un estado o añade algo al estado existente.
Qué garantiza HTTP para cada método

La especificación de HTTP, el protocolo de la web (RFC 9110), define como idempotente todo método en el que enviar varias veces la misma solicitud tiene el mismo efecto previsto en el servidor que enviarla una sola vez.
(1) Solicitudes de lectura
GET, HEAD, OPTIONS y TRACE son métodos seguros que solo solicitan operaciones de lectura. Todos son idempotentes.
(2) PUT y DELETE
PUT fija el estado del recurso de destino según el contenido enviado y DELETE elimina el recurso. Como el estado final es el mismo aunque se repita la solicitud, ambos métodos se definen como idempotentes.
(3) POST y PATCH
POST deja en manos del receptor cómo procesar el contenido, así que enviarlo dos veces puede generar dos pedidos. En PATCH tampoco se garantiza la idempotencia.
Esta distinción se aplica en la práctica a los reintentos. Si se interrumpe la conexión y el cliente no puede leer la respuesta, puede volver a enviar automáticamente una solicitud idempotente. Para las solicitudes no idempotentes, el estándar recomienda evitar el reintento automático si no hay forma de saber que la solicitud original quedó sin aplicar. Además, la idempotencia permite que la respuesta varíe. Por ejemplo, si se envía por segunda vez una solicitud de borrado, es válido que la respuesta indique «no existe», aunque la primera haya sido distinta.

Cómo gestionar las solicitudes duplicadas y qué malentendidos son frecuentes

¿Qué se puede hacer si es inevitable volver a enviar una solicitud POST no idempotente? Una solución habitual es la clave de idempotencia, un valor único que se asigna a cada solicitud. El servicio de pagos Stripe permite añadir a las solicitudes el encabezado Idempotency-Key. La clave admite un máximo de 255 caracteres, y Stripe recomienda usar un valor como un UUID aleatorio. Si recibe otra solicitud con la misma clave, devuelve el código de estado y el cuerpo de la primera respuesta tal como eran. La clave se puede eliminar una vez transcurridas al menos 24 horas. Si llega una solicitud con la misma clave y un contenido distinto, Stripe la trata como un error. En la misma idea se basan los sistemas de procesamiento de eventos que producen el mismo resultado aunque un mensaje llegue dos o más veces.
- Respuesta (Response): la idempotencia implica que el estado del servidor no vuelve a cambiar tras la primera solicitud, aunque la respuesta pueda variar.
- Efecto secundario (Side Effect): el criterio se limita al efecto previsto y deja fuera acciones como registrar la solicitud en el servidor.
- Composición (Composition): encadenar pasos idempotentes no garantiza que el conjunto sea idempotente.
- Ejemplo (Example): si la variable vale 3, al ejecutar una vez la secuencia «leer, cambiar el valor a 5 y leer», se obtienen 3 y 5. La segunda vez se obtienen 5 y 5.
Para que pulsar dos veces sea seguro, el propio sistema debe estar diseñado para tolerarlo incluso si el usuario se descuida. El primer paso hacia la idempotencia es diseñar desde el principio las operaciones de modo que den el mismo resultado al repetirlas.