Una operación es idempotente cuando ejecutarla dos veces deja el mundo como lo dejó ejecutarla una. Borrar un archivo es idempotente. Mandar un mensaje no lo es, y en esa asimetría viven casi todos los errores de mensajes duplicados.
Dónde hace falta de verdad
- En los manejadores de webhooks, porque la entrega es al menos una vez y un reintento es normal.
- En cualquier cosa que reintentes tras agotarse un tiempo de espera, porque un tiempo agotado no te dice si la escritura llegó.
- En cualquier cosa que una cola pueda reentregar, que es toda cola.
Cómo conseguirla, barata
Lleva una tabla con los ids sobre los que ya has actuado e inserta en ella con una restricción de unicidad antes de hacer el trabajo. Si la inserción falla, alguien ya gestionó este. Esa es toda la técnica; no necesita biblioteca y sobrevive al reinicio a mitad que una versión en memoria no sobrevive.
Inserta antes, no después. Insertar después deja una ventana entre hacer la cosa y registrar que la hiciste, y una caída en esa ventana es justo el caso que la tabla debía cubrir.
Qué usar como id
Como llame el emisor al evento, si te da un nombre. Si no, construye una clave con los campos que hacen que el evento sea ese evento — la cuenta, el chat y el mensaje, por ejemplo — y hazle un hash. Una clave derivada de una marca de tiempo no es una clave: el reintento tiene otra.
La idempotencia no es deduplicar en la interfaz. Para cuando un duplicado llega a una pantalla ya has mandado el segundo mensaje. La comprobación va arriba del todo del manejador, antes de que salga nada.
Preguntas frecuentes
¿Los agentes de IA hacen más probables los duplicados?
Pueden. A un agente de IA al que se le pide dos veces puede que envíe dos veces, y uno que reintenta tras un tiempo de espera agotado puede no saber que el primer intento funcionó. Dale una regla en sus instrucciones — lee la conversación antes de volver a enviar — y haz que una persona apruebe los envíos.
¿El botón Aplicar de una sala de proyecto es idempotente?
Una propuesta de una sala se ejecuta una sola vez. Pulsar Aplicar por segunda vez no cambia nada.