Исходный код вики Гарантии доставки
Версия 1.12 от Alexandr Fokin на 2026/07/19 13:37
Скрыть последних авторов
| 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" %)Гарантия доставки не более одного раза. | ||
| |
1.12 | 13 | Гарантируется, то не будет дублей, но допускаются потери.|(% style="width:1164px" %)((( |
| 14 | Без подтверждения доставки и повторных отправок (гарантирует отсутствие дублей), но сообщение может быть потеряно на фазе отправки (т.к. без подтверждения). | ||
| 15 | |||
| 16 | {{code language="none"}} | ||
| 17 | Acks = None | ||
| 18 | MessageSendMaxRetries = 0 | ||
| 19 | {{/code}} | ||
| 20 | )))|(% style="width:1164px" %)((( | ||
| 21 | Сообщение коммитится сразу (без подтверждения), это гарантирует что не будет дублирования, но сообщение может быть потеряно на фазе получения (падение или timeout потребителя). | ||
| 22 | |||
| 23 | {{code language="none"}} | ||
| 24 | AutoOffsetReset = AutoOffsetReset.Earliest | ||
| |
1.2 | 25 | ENABLE_AUTO_COMMIT = true |
| |
1.12 | 26 | {{/code}} |
| 27 | ))) | ||
| |
1.1 | 28 | |(% style="width:128px" %)((( |
| 29 | At‑Most‑Once | ||
| 30 | )))|(% style="width:1164px" %)Гарантия доставки хотя бы один раз. | ||
| |
1.12 | 31 | Гарантируется, что не будет потерь, но возможны дубли.|(% style="width:1164px" %)((( |
| 32 | 1) Гарантия подтверждения доставки до брокера. | ||
| 33 | |||
| 34 | {{code language="none"}} | ||
| 35 | Acks = All | ||
| 36 | EnableIdempotence = false | ||
| 37 | {{/code}} | ||
| 38 | |||
| |
1.1 | 39 | В данном случае отправка может выполнится, но потеряется подтверждение отправки. В таком случае будет повторная отправка, которая приведет к дублированию на отправке. |
| 40 | \\2) Дополнение. Наличие функции дедубликации в kafka. | ||
| 41 | Позволяет устранить дублирование на отправке. Kafka отслеживает повторную отправку и отбрасывает. | ||
| |
1.12 | 42 | |
| 43 | {{code language="none"}} | ||
| 44 | EnableIdempotence = true | ||
| |
1.1 | 45 | MessageSendMaxRetries <> 0 |
| |
1.12 | 46 | |
| 47 | // влияет на идентификацию экземпляра | ||
| 48 | // producer при переподключении. | ||
| 49 | transactional.id | ||
| 50 | {{/code}} | ||
| 51 | )))|(% style="width:1164px" %)((( | ||
| 52 | 1) Использование ручного коммита после завершения обработки (транзакции БД). | ||
| 53 | |||
| 54 | {{code language="none"}} | ||
| 55 | AutoOffsetReset = AutoOffsetReset.Earliest | ||
| |
1.2 | 56 | ENABLE_AUTO_COMMIT = false |
| |
1.12 | 57 | {{/code}} |
| 58 | |||
| 59 | Возможные проблемы: | ||
| 60 | |||
| 61 | ((( | ||
| |
1.11 | 62 | 1. Дублирование на отправке. |
| 63 | 1. Не закомиченное смещение (падение consumer). | ||
| 64 | 1. Отвал consumer по timeout (долгая обработка, сообщение передано к другому consumer). | ||
| 65 | |||
| |
1.12 | 66 | 2) TransactionalInbox. |
| |
1.11 | 67 | ))) |
| |
1.12 | 68 | ))) |
| |
1.1 | 69 | |(% style="width:128px" %)((( |
| 70 | Exactly‑Once | ||
| 71 | )))|(% style="width:1164px" %)Гарантия доставки строго один раз. | ||
| 72 | Гарантия отсутствия потерь и дублей.|(% style="width:1164px" %)Kafka transactions|(% style="width:1164px" %) | ||
| 73 | ))) | ||
| |
1.4 | 74 | |(% style="width:108px" %) |(% style="width:1326px" %)((( |
| 75 | |(% style="width:136px" %)TransactionalInbox|(% style="width:1216px" %)((( | ||
| |
1.7 | 76 | |(% style="width:207px" %)Полный|(% style="width:991px" %)Хранится IdempotencyId каждого входящего сообщения (уникальный индекс), для дедубликации. |
| 77 | Полная защита от дублей (даже если это несколько сообщений, с одинаковым ключом). | ||
| 78 | |(% style="width:207px" %)Только offset (облегченный)|(% style="width:991px" %)Специфично для kafka. Храниться только topic+partition+offset. | ||
| |
1.8 | 79 | Защищает только от потери смещения (сообщение обработано, но offset не закомичен) и consumer timeout. Не поможет при дублировании на отправке (более 1 сообщения). |
| |
1.7 | 80 | |(% style="width:207px" %) |(% style="width:991px" %) |
| |
1.4 | 81 | ))) |
| 82 | |(% style="width:136px" %) |(% style="width:1216px" %) | ||
| 83 | ))) | ||
| |
1.1 | 84 | |(% style="width:108px" %) |(% style="width:1326px" %)Более строгие гарантии могут давать большие накладные расходы (пропускная способность и задержка доставки). |
| 85 | |||
| 86 |