Гарантии доставки

Версия 1.1 от Alexandr Fokin на 2026/07/19 12:55

Материалы
 Apache Kafka в гарантиях или как надежно доставить сообщение
https://habr.com/ru/companies/otus/articles/930372/
 Kafka для начинающих: Гарантии доставки на практике и идемпотентность
https://habr.com/ru/articles/961048/
  
 
ТипОписаниеProducerConsumer

At‑Most‑Once

Гарантия доставки не более одного раза.
Гарантируется, то не будет дублей, но допускаются потери.
Без подтверждения доставки и повторных отправок (гарантирует отсутствие дублей), но сообщение может быть потеряно на фазе отправки (т.к. без подтверждения).

Acks = 0
MessageSendMaxRetries = 0
Сообщение коммитится сразу (без подтверждения), это гарантирует что не будет дублирования, но сообщение может быть потеряно на фазе получения (падение или timeout потребителя).

ENABLE_AUTO_COMMIT = true

At‑Most‑Once

Гарантия доставки хотя бы один раз.
Гарантируется, что не будет потерь, но возможны дубли.
1) Гарантия подтверждения доставки до про брокера.
В данном случае отправка может выполнится, но потеряется подтверждение отправки. В таком случае будет повторная отправка, которая приведет к дублированию на отправке.

Acks = All
EnableIdempotence = false

2) Дополнение. Наличие функции дедубликации в kafka.
Позволяет устранить дублирование на отправке. Kafka отслеживает повторную отправку и отбрасывает.

EnableIdempotence = true
MessageSendMaxRetries <> 0

transactional.id - влияет на идентификацию экземпляра producer при переподключении. 
Использование ручного коммита после завершения обработки (транзакции БД).

ENABLE_AUTO_COMMIT = false

Может использоваться для дедупликации.
TransactionalInbox.

Exactly‑Once

Гарантия доставки строго один раз.
Гарантия отсутствия потерь и дублей.
Kafka transactions 
 Более строгие гарантии могут давать большие накладные расходы (пропускная способность и задержка доставки).