Исходный код вики Гарантии доставки

Версия 1.5 от Alexandr Fokin на 2026/07/19 13:13

Скрыть последних авторов
Alexandr Fokin 1.1 1 |(% style="width:108px" %)Материалы|(% style="width:1326px" %)(((
2 | |Apache Kafka в гарантиях или как надежно доставить сообщение
3 [[https:~~/~~/habr.com/ru/companies/otus/articles/930372/>>https://habr.com/ru/companies/otus/articles/930372/]]
4 | |Kafka для начинающих: Гарантии доставки на практике и идемпотентность
5 [[https:~~/~~/habr.com/ru/articles/961048/>>https://habr.com/ru/articles/961048/]]
6 | |
7 )))
8 |(% style="width:108px" %) |(% style="width:1326px" %)(((
9 |(% style="width:128px" %)Тип|(% style="width:1164px" %)Описание|(% style="width:1164px" %)Producer|(% style="width:1164px" %)Consumer
10 |(% style="width:128px" %)(((
11 At‑Most‑Once
12 )))|(% style="width:1164px" %)Гарантия доставки не более одного раза.
13 Гарантируется, то не будет дублей, но допускаются потери.|(% style="width:1164px" %)Без подтверждения доставки и повторных отправок (гарантирует отсутствие дублей), но сообщение может быть потеряно на фазе отправки (т.к. без подтверждения).
Alexandr Fokin 1.3 14 \\Acks = None
Alexandr Fokin 1.1 15 MessageSendMaxRetries = 0|(% style="width:1164px" %)Сообщение коммитится сразу (без подтверждения), это гарантирует что не будет дублирования, но сообщение может быть потеряно на фазе получения (падение или timeout потребителя).
Alexandr Fokin 1.2 16 \\AutoOffsetReset = AutoOffsetReset.Earliest
17 ENABLE_AUTO_COMMIT = true
Alexandr Fokin 1.1 18 |(% style="width:128px" %)(((
19 At‑Most‑Once
20 )))|(% style="width:1164px" %)Гарантия доставки хотя бы один раз.
21 Гарантируется, что не будет потерь, но возможны дубли.|(% style="width:1164px" %)1) Гарантия подтверждения доставки до про брокера.
22 В данном случае отправка может выполнится, но потеряется подтверждение отправки. В таком случае будет повторная отправка, которая приведет к дублированию на отправке.
23 \\Acks = All
24 EnableIdempotence = false
25 \\2) Дополнение. Наличие функции дедубликации в kafka.
26 Позволяет устранить дублирование на отправке. Kafka отслеживает повторную отправку и отбрасывает.
27 \\EnableIdempotence = true
28 MessageSendMaxRetries <> 0
29 \\transactional.id - влияет на идентификацию экземпляра producer при переподключении. |(% style="width:1164px" %)Использование ручного коммита после завершения обработки (транзакции БД).
Alexandr Fokin 1.2 30 \\AutoOffsetReset = AutoOffsetReset.Earliest
31 ENABLE_AUTO_COMMIT = false
Alexandr Fokin 1.1 32 \\Может использоваться для дедупликации.
33 TransactionalInbox.
Alexandr Fokin 1.4 34 \\Долгая обработка сообщения может привести к отключению consumer по timeout. Это может провести к тому, что сообщение поступит на другой потребитель. В таком случае только TransactionalInbox.
Alexandr Fokin 1.1 35 |(% style="width:128px" %)(((
36 Exactly‑Once
37 )))|(% style="width:1164px" %)Гарантия доставки строго один раз.
38 Гарантия отсутствия потерь и дублей.|(% style="width:1164px" %)Kafka transactions|(% style="width:1164px" %)
39 )))
Alexandr Fokin 1.4 40 |(% style="width:108px" %) |(% style="width:1326px" %)(((
41 |(% style="width:136px" %)TransactionalInbox|(% style="width:1216px" %)(((
42 |(% style="width:248px" %)Полный|(% style="width:950px" %)Хранится IdempotencyId каждого входящего сообщения (уникальный индекс), для дедубликации.
43 |(% style="width:248px" %)Только offset (облегченный)|(% style="width:950px" %)Специфично для kafka. Храниться только topic+partition+offset.
44 |(% style="width:248px" %) |(% style="width:950px" %)
45 )))
46 |(% style="width:136px" %) |(% style="width:1216px" %)
47
48
49 )))
Alexandr Fokin 1.1 50 |(% style="width:108px" %) |(% style="width:1326px" %)Более строгие гарантии могут давать большие накладные расходы (пропускная способность и задержка доставки).
51
52