Исходный код вики Гарантии доставки
Версия 1.8 от Alexandr Fokin на 2026/07/19 13:17
Скрыть последних авторов
| author | version | line-number | content |
|---|---|---|---|
| |
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" %)Без подтверждения доставки и повторных отправок (гарантирует отсутствие дублей), но сообщение может быть потеряно на фазе отправки (т.к. без подтверждения). | ||
| |
1.3 | 14 | \\Acks = None |
| |
1.1 | 15 | MessageSendMaxRetries = 0|(% style="width:1164px" %)Сообщение коммитится сразу (без подтверждения), это гарантирует что не будет дублирования, но сообщение может быть потеряно на фазе получения (падение или timeout потребителя). |
| |
1.2 | 16 | \\AutoOffsetReset = AutoOffsetReset.Earliest |
| 17 | ENABLE_AUTO_COMMIT = true | ||
| |
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" %)Использование ручного коммита после завершения обработки (транзакции БД). | ||
| |
1.2 | 30 | \\AutoOffsetReset = AutoOffsetReset.Earliest |
| 31 | ENABLE_AUTO_COMMIT = false | ||
| |
1.1 | 32 | \\Может использоваться для дедупликации. |
| 33 | TransactionalInbox. | ||
| |
1.4 | 34 | \\Долгая обработка сообщения может привести к отключению consumer по timeout. Это может провести к тому, что сообщение поступит на другой потребитель. В таком случае только TransactionalInbox. |
| |
1.1 | 35 | |(% style="width:128px" %)((( |
| 36 | Exactly‑Once | ||
| 37 | )))|(% style="width:1164px" %)Гарантия доставки строго один раз. | ||
| 38 | Гарантия отсутствия потерь и дублей.|(% style="width:1164px" %)Kafka transactions|(% style="width:1164px" %) | ||
| 39 | ))) | ||
| |
1.4 | 40 | |(% style="width:108px" %) |(% style="width:1326px" %)((( |
| 41 | |(% style="width:136px" %)TransactionalInbox|(% style="width:1216px" %)((( | ||
| |
1.7 | 42 | |(% style="width:207px" %)Полный|(% style="width:991px" %)Хранится IdempotencyId каждого входящего сообщения (уникальный индекс), для дедубликации. |
| 43 | Полная защита от дублей (даже если это несколько сообщений, с одинаковым ключом). | ||
| 44 | |(% style="width:207px" %)Только offset (облегченный)|(% style="width:991px" %)Специфично для kafka. Храниться только topic+partition+offset. | ||
| |
1.8 | 45 | Защищает только от потери смещения (сообщение обработано, но offset не закомичен) и consumer timeout. Не поможет при дублировании на отправке (более 1 сообщения). |
| |
1.7 | 46 | |(% style="width:207px" %) |(% style="width:991px" %) |
| |
1.4 | 47 | ))) |
| 48 | |(% style="width:136px" %) |(% style="width:1216px" %) | ||
| 49 | ))) | ||
| |
1.1 | 50 | |(% style="width:108px" %) |(% style="width:1326px" %)Более строгие гарантии могут давать большие накладные расходы (пропускная способность и задержка доставки). |
| 51 | |||
| 52 |