Назад к вопросам
Senior
2
Гарантии доставки в Kafka: at most once, at least once, exactly once. Как обеспечить exactly once?
Компании, где спрашивали
Магнит Тех
Ответ от нейросети
sobes.tech AI
В Kafka есть три основных гарантии доставки сообщений:
- At most once — сообщение доставляется не более одного раза, возможна потеря сообщений.
- At least once — сообщение доставляется как минимум один раз, возможны дубликаты.
- Exactly once — сообщение доставляется ровно один раз, без потерь и дубликатов.
Для обеспечения exactly once в Kafka используют транзакции и идемпотентных продюсеров. Основные шаги:
- Включить идемпотентность у продюсера (
enable.idempotence=true), чтобы избежать дубликатов при повторных отправках. - Использовать транзакции (
initTransactions(),beginTransaction(),commitTransaction(),abortTransaction()) для группировки отправки сообщений и коммитов оффсетов. - Консьюмеры должны использовать
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 семантику.