Sobes.tech
Junior — Middle

Cum se asigură posibilitatea de a livra mesajele cel puțin o dată în Kafka?

sobes.tech AI

Răspuns de la AI

În Apache Kafka, livrarea mesajelor cu garanția "cel puțin o dată" este asigurată prin mecanismul de confirmări (acknowledgments) și gestionarea offseturilor (offsets).

Procesul arată astfel:

  1. Producătorul trimite un mesaj către Kafka și așteaptă confirmarea de la broker (de exemplu, ack=all — confirmarea de la toate replicile).
  2. Mesajul este salvat în jurnalul (logurile) brokerului.
  3. Consumatorul citește mesajul și, după o procesare reușită, trimite o confirmare (commit) a offsetului (offset) către Kafka.

Dacă consumatorul cade înainte de a confirma, la repornire va citi mesajul din nou, asigurând livrarea "cel puțin o dată".

Exemplu în Go folosind biblioteca sarama:

consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// În handler-ul de mesaje:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
    for message := range claim.Messages() {
        process(message) // procesarea mesajului
        sess.MarkMessage(message, "") // confirmarea procesării
    }
    return nil
}

Prin urmare, dacă confirmarea nu este trimisă, mesajul va fi livrat din nou.