Junior — Middle
¿Cómo se garantiza la capacidad de entregar mensajes al menos una vez en Kafka?
sobes.tech AI
Respuesta de la IA
En Apache Kafka, la entrega de mensajes con garantía de "al menos una vez" se asegura mediante el mecanismo de confirmaciones (acknowledgments) y la gestión de desplazamientos (offsets).
El proceso es el siguiente:
- El productor envía un mensaje a Kafka y espera la confirmación del broker (por ejemplo, ack=all — confirmación de todas las réplicas).
- El mensaje se guarda en el registro (logs) del broker.
- El consumidor lee el mensaje y, tras un procesamiento exitoso, envía una confirmación (commit) del desplazamiento (offset) a Kafka.
Si el consumidor falla antes de confirmar, al reiniciar leerá el mensaje nuevamente, lo que garantiza la entrega "al menos una vez".
Ejemplo en Go usando la biblioteca sarama:
consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// En el manejador de mensajes:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for message := range claim.Messages() {
process(message) // procesamiento del mensaje
sess.MarkMessage(message, "") // confirmación del procesamiento
}
return nil
}
Por lo tanto, si no se envía la confirmación, el mensaje será entregado nuevamente.