Sobes.tech
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ő:

  1. 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).
  2. Az üzenet elmentésre kerül a broker naplójába.
  3. 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.