Назад к вопросам
Junior — Middle
87
Как обеспечивается возможность доставки сообщений по крайней мере один раз в Kafka?
Компании, где спрашивали
Notix Games
Ответ от нейросети
sobes.tech AI
В Apache Kafka доставка сообщений с гарантией "по крайней мере один раз" обеспечивается за счёт механизма подтверждений (acknowledgments) и управления смещениями (offsets).
Процесс выглядит так:
- Продюсер отправляет сообщение в Kafka и ждёт подтверждения от брокера (например, ack=all — подтверждение от всех реплик).
- Сообщение сохраняется в журнале (логах) брокера.
- Консьюмер читает сообщение и после успешной обработки отправляет подтверждение (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
}
Таким образом, если подтверждение не отправлено, сообщение будет доставлено повторно.