Sobes.tech
Back to questions
Senior
3

Гарантии доставки в Kafka: at most once, at least once, exactly once. Как обеспечить exactly once?

Companies where asked
Магнит Тех

Answer from AI

sobes.tech AI

В Kafka есть три основных гарантии доставки сообщений:

  • At most once — сообщение доставляется не более одного раза, возможна потеря сообщений.
  • At least once — сообщение доставляется как минимум один раз, возможны дубликаты.
  • Exactly once — сообщение доставляется ровно один раз, без потерь и дубликатов.

Для обеспечения exactly once в Kafka используют транзакции и идемпотентных продюсеров. Основные шаги:

  1. Включить идемпотентность у продюсера (enable.idempotence=true), чтобы избежать дубликатов при повторных отправках.
  2. Использовать транзакции (initTransactions(), beginTransaction(), commitTransaction(), abortTransaction()) для группировки отправки сообщений и коммитов оффсетов.
  3. Консьюмеры должны использовать read_committed режим, чтобы читать только подтвержденные транзакции.

Пример на Go с использованием библиотеки confluent-kafka-go:

producer, _ := kafka.NewProducer(&kafka.ConfigMap{
    "bootstrap.servers": "localhost:9092",
    "enable.idempotence": true,
    "transactional.id": "my-transactional-id",
})

producer.InitTransactions(nil)
producer.BeginTransaction()

// Отправка сообщений
producer.Produce(&kafka.Message{TopicPartition: kafka.TopicPartition{Topic: &topic, Partition: kafka.PartitionAny}, Value: []byte("message")}, nil)

// Коммит транзакции
producer.CommitTransaction(nil)

Таким образом, транзакции гарантируют, что либо все операции внутри транзакции будут применены, либо ни одной, что обеспечивает exactly once семантику.