Claves de idempotencia en la práctica: reintentos seguros

Las redes fallan en mitad de las solicitudes todo el tiempo. El cliente envía una solicitud de pago, el servidor la procesa, cobra la tarjeta, y luego la respuesta nunca llega de vuelta: tiempo de espera agotado, conexión interrumpida, lo que sea. El cliente, al no recibir respuesta, reintenta. Ahora le has cobrado al cliente dos veces.

Esto no es un caso extremo hipotético. Es el comportamiento por defecto de cualquier mecanismo de reintentos que hayas publicado, a menos que lo hayas diseñado explícitamente para evitarlo. Las claves de idempotencia son la solución estándar, pero la mayoría de las implementaciones que he visto se equivocan en los detalles: guardan la clave sin guardar la respuesta, no manejan reintentos concurrentes, o dejan que la clave colisione entre distintos cuerpos de solicitud. Vamos a corregir eso.