Junior — Middle
Hogyan biztosított az üzenetek legalább egyszeri kézbesítése Kafka-ban?
sobes.tech MI
Válasz az MI-től
Az Apache Kafka-ban az "legalább egyszer" garantált üzenetkézbesítés a megerősítések (acknowledgments) és az offsetek (offsets) kezelésének mechanizmusával biztosított.
A folyamat a következő:
- A producer elküldi az üzenetet a Kafka-nak, és várja a broker megerősítését (pl. ack=all — minden replikától megerősítés).
- Az üzenet elmentésre kerül a broker naplójába.
- A fogyasztó olvassa az üzenetet, és sikeres feldolgozás után megerősítést (commit) küld az offsetről a Kafka-nak.
Ha a fogyasztó összeomlik megerősítés előtt, újraindításkor újraolvassa az üzenetet, ez biztosítja az "legalább egyszer" kézbesítést.
Példa Go nyelven a sarama könyvtár használatával:
consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// Az üzenetkezelőben:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
for message := range claim.Messages() {
process(message) // üzenet feldolgozása
sess.MarkMessage(message, "") // feldolgozás megerősítése
}
return nil
}
Tehát, ha a megerősítés nem kerül elküldésre, az üzenet újra kézbesítésre kerül.