Garantias de entrega y orden
Kafka ofrece piezas para construir sistemas fiables, pero las garantias finales dependen de configuracion, consumidores y sistemas externos.
Orden
Kafka garantiza orden dentro de una partition.
Si necesitas orden por pedido:
key = order_idTodos los eventos del mismo pedido iran a la misma partition.
At most once
Puede perder eventos si confirmas antes de procesar.
commit offset -> procesar -> falloEl evento queda marcado como leido aunque no se haya procesado.
At least once
Puede duplicar eventos, pero evita perdida si el consumidor es idempotente.
procesar -> fallo antes de commit -> reprocesarEs el modelo practico mas habitual.
Exactly once
Kafka soporta transacciones e idempotent producers para escenarios Kafka-to-Kafka.
Limitacion importante: si escribes en una base externa, necesitas coordinar idempotencia o transacciones fuera de Kafka.
Productor idempotente
enable.idempotence=true
acks=all
retries>0Ayuda a evitar duplicados por reintentos del producer.
Transacciones
Permiten producir en varios partitions/topics y confirmar offsets de consumo como una unidad dentro de Kafka.
Util para:
consume topic A -> transform -> produce topic BConsumidor idempotente
Patron:
1. Leer event_id.
2. Comprobar si ya fue procesado.
3. Si no, ejecutar efecto.
4. Guardar event_id procesado.
5. Commit offset.Duplicados
Asume duplicados cuando:
- Hay reintentos.
- El consumer cae despues de procesar y antes de commit.
- Se reprocesan offsets.
- Hay errores de red.
Perdida de eventos
Riesgos:
acks=0.acks=1y fallo del leader antes de replicar.min.insync.replicasmal configurado.- Retencion demasiado corta.
- Consumidores que hacen commit antes de persistir.
Buenas practicas
- Usa keys para ordenar por entidad.
- No prometas orden global.
- Diseña consumidores idempotentes.
- Usa
acks=allen eventos importantes. - Ajusta
min.insync.replicas. - Documenta semantica real: at-least-once, exactly-once Kafka-to-Kafka, etc.
