Idempotencia de los Webhooks
Sangho garantiza una entrega at-least-once (al menos una vez): un evento puede entregarse varias veces en caso de fallo de red, de timeout o de reinicio de su servidor. Su endpoint debe ser idempotente: procesar dos veces el mismo evento no debe producir ningún efecto secundario adicional.
Estrategia de deduplicación
- 1. Extraer el
Sangho-Event-IDde la cabecera (oevent.iddel cuerpo). - 2. Comprobar en la base de datos si ese ID ya se ha procesado.
- 3. Si es así → devolver
200de inmediato sin volver a procesarlo. - 4. Si no → procesar el evento y registrar después el ID.
No utilice un Set en memoria en producción: se
reinicia al reiniciar el servidor. Utilice una tabla SQL con una restricción
PRIMARY KEY sobre event_id, o
Redis con SET NX (SET if Not eXists).
En PostgreSQL y SQLite, utilice INSERT … ON CONFLICT (event_id) DO NOTHING
para una deduplicación atómica sin condiciones de carrera, incluso con carga concurrente.
Deduplicación (Node.js)
Modelo SQL de deduplicación
Cree una tabla específica para almacenar los ID de los eventos ya procesados. La restricción PRIMARY KEY sobre event_id garantiza
la unicidad a nivel de base de datos, incluso con solicitudes concurrentes.
Añada un índice sobre processed_at para facilitar la
limpieza periódica de los registros antiguos (por ejemplo, tras 30 días).
Sangho no volverá a entregar nunca un evento pasadas 48 horas. Puede eliminar sin riesgo los registros de deduplicación con más de 72 horas. Programe una tarea de limpieza mediante Celery Beat, cron o una tarea programada.