Tu servicio Go procesa mensajes de Kafka con 50 particiones. Al escalar a 10 instancias, algunos mensajes se procesan duplicados y el orden se pierde. ¿Cómo lo resuelves?
Contexto
Plataforma de pagos. Cada transacción debe procesarse exactamente una vez y en orden por usuario. El volumen es 10K mensajes/segundo.
Respuesta modelo
Solución: 1) Configurar consumer group con particiones asignadas por user_id como key (Kafka garantiza orden dentro de una partición). 2) Idempotencia: guardar un ID de procesamiento por transacción en Redis con TTL. Antes de procesar, verificar si ya existe. 3) Commits manuales de offset (no auto-commit) solo después de confirmar persistencia. 4) Implementar graceful shutdown: al recibir SIGTERM, dejar de consumir, procesar mensajes en vuelo, luego cerrar. 5) Dead letter topic para mensajes que fallan 3 veces.
Claves
- Partition key por user_id garantiza orden por usuario.
- Idempotencia con Redis previene duplicados.
- Manual commit + graceful shutdown = exactly-once semantics.