Sobes.tech
Junior — Middle

Kafka-da mesajların ən az bir dəfə çatdırılma imkanı necə təmin edilir?

sobes.tech Süni İntellekt

AI-dan cavab

Apache Kafka-da "əmin olmağı ən azı bir dəfə" zəmanəti ilə mesajların çatdırılması təsdiqləmələr (acknowledgments) və ofsetlərin (offsets) idarə olunması mexanizmi ilə təmin edilir.

Proses aşağıdakı kimidir:

  1. İstehsalçı Kafka-ya mesaj göndərir və broker-dan təsdiqləmə gözləyir (məsələn, ack=all — bütün replikalardan təsdiqləmə).
  2. Mesaj broker-un loglarına qeyd olunur.
  3. İstehlakçı mesajı oxuyur və uğurlu emaldan sonra Kafka-ya ofsetin (offset) təsdiqlənməsini (commit) göndərir.

Əgər istehlakçı təsdiqləmədən əvvəl çöksə, yenidən başladıqda mesajı yenidən oxuyacaq, bu da "əmin olmağı ən azı bir dəfə" təmin edir.

Go dilində sarama kitabxanası ilə nümunə:

consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// Mesajların emalı üçün:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
    for message := range claim.Messages() {
        process(message) // mesajın emalı
        sess.MarkMessage(message, "") // emalın təsdiqi
    }
    return nil
}

Yəni, təsdiqləmə göndərilmədiyi halda, mesaj yenidən çatdırılacaq.