🔍 Diagnóstico#
- Contar cargos por operación, no operaciones. La métrica es
charges_appliedsobre un mismoIdempotency-Key. Si da más de 1, hay duplicación. - Buscar la ventana check-then-act.
if (!table.containsKey(k)) table.put(k, v)son dos operaciones con un hueco en el medio. La versión correcta es una sola:putIfAbsent,TryAdd,LoadOrStore,entry(),INSERT ... ON CONFLICT. - Preguntar dónde vive la tabla de idempotencia. Si vive en el heap del proceso, funciona con una réplica y deja de funcionar con dos. Ese bug no aparece al escribir el código: aparece al escalar.
- Verificar que el reintento reciba la misma respuesta. Un reintento que recibe un
409 Conflictobliga al cliente a interpretar un error; uno que recibe la respuesta original no tiene que interpretar nada. - Separar el efecto local del que cruza el boundary. El cargo y el email no pueden estar en la misma transacción si viven en sistemas distintos. Si no hay outbox, hay una ventana donde uno existe y el otro no.
Caso 16 · Idempotencia y efectos duplicados — ⬅️ README del caso · ⚖️ Comparativa de los 7 stacks
🗺️ Contexto · 🩺 Síntomas · 🔍 Diagnóstico · 🧠 Causas raíz · 🛠️ Opciones de solución · ⚖️ Trade-offs · 💼 Valor de negocio · 🚨 Postmortem