Sobes.tech
Назад к вопросам
Junior — Middle
87

Как обеспечивается возможность доставки сообщений по крайней мере один раз в Kafka?

Компании, где спрашивали
Notix Games

Ответ от нейросети

sobes.tech AI

В Apache Kafka доставка сообщений с гарантией "по крайней мере один раз" обеспечивается за счёт механизма подтверждений (acknowledgments) и управления смещениями (offsets).

Процесс выглядит так:

  1. Продюсер отправляет сообщение в Kafka и ждёт подтверждения от брокера (например, ack=all — подтверждение от всех реплик).
  2. Сообщение сохраняется в журнале (логах) брокера.
  3. Консьюмер читает сообщение и после успешной обработки отправляет подтверждение (commit) смещения (offset) в Kafka.

Если консьюмер упадёт до подтверждения, при перезапуске он прочитает сообщение снова, что обеспечивает доставку "по крайней мере один раз".

Пример на Go с использованием библиотеки sarama:

consumer, err := sarama.NewConsumerGroup(brokers, groupID, config)
// ...
// В обработчике сообщений:
func (h *handler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
    for message := range claim.Messages() {
        process(message) // обработка сообщения
        sess.MarkMessage(message, "") // подтверждение обработки
    }
    return nil
}

Таким образом, если подтверждение не отправлено, сообщение будет доставлено повторно.