Junior — Middle
Wie wird die Möglichkeit gewährleistet, Nachrichten mindestens einmal in Kafka zu liefern?
sobes.tech KI
Antwort von AI
In Apache Kafka wird die Zustellung von Nachrichten mit der Garantie "mindestens einmal" durch den Mechanismus der Bestätigungen (acknowledgments) und die Verwaltung der Offsets sichergestellt.
Der Prozess sieht folgendermaßen aus:
- Der Producer sendet eine Nachricht an Kafka und wartet auf die Bestätigung des Brokers (z.B. ack=all — Bestätigung von allen Replikaten).
- Die Nachricht wird im Log des Brokers gespeichert.
- Der Consumer liest die Nachricht und sendet nach erfolgreicher Verarbeitung eine Bestätigung (Commit) des Offsets an Kafka.
Wenn der Consumer abstürzt, bevor er bestätigt, liest er die Nachricht beim Neustart erneut, was die "mindestens einmal" Zustellung gewährleistet.
Beispiel in Go mit der Bibliothek sarama:
consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// Im Nachrichten-Handler:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for message := range claim.Messages() {
process(message) // Verarbeitung der Nachricht
sess.MarkMessage(message, "") // Bestätigung der Verarbeitung
}
return nil
}
Wenn die Bestätigung nicht gesendet wird, wird die Nachricht erneut zugestellt.