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

Редактировал(а) Alexandr Fokin 2026/07/27 03:09

Последние авторы
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" %)(((
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
25 ENABLE_AUTO_COMMIT = true
26 {{/code}}
27 )))
28 |(% style="width:128px" %)(((
29 At‑Most‑Once
30 )))|(% style="width:1164px" %)Гарантия доставки хотя бы один раз.
31 Гарантируется, что не будет потерь, но возможны дубли.|(% style="width:1164px" %)(((
32 1) Гарантия подтверждения доставки до брокера.
33
34 {{code language="none"}}
35 Acks = All
36 EnableIdempotence = false
37 {{/code}}
38
39 В данном случае отправка может выполнится, но потеряется подтверждение отправки. В таком случае будет повторная отправка, которая приведет к дублированию на отправке.
40 \\2) Дополнение. Наличие функции дедубликации в kafka.
41 Позволяет устранить дублирование на отправке. Kafka отслеживает повторную отправку и отбрасывает.
42
43 {{code language="none"}}
44 EnableIdempotence = true
45 MessageSendMaxRetries <> 0
46
47 // влияет на идентификацию экземпляра
48 // producer при переподключении.
49 transactional.id
50 {{/code}}
51 )))|(% style="width:1164px" %)(((
52 1) Использование ручного коммита после завершения обработки (транзакции БД).
53
54 {{code language="none"}}
55 AutoOffsetReset = AutoOffsetReset.Earliest
56 ENABLE_AUTO_COMMIT = false
57 {{/code}}
58
59 Возможные проблемы:
60
61 (((
62 1. Дублирование на отправке.
63 1. Не закомиченное смещение (падение consumer).
64 1. Отвал consumer по timeout (долгая обработка, сообщение передано к другому consumer).
65
66 2) TransactionalInbox.
67 )))
68 )))
69 |(% style="width:128px" %)(((
70 Exactly‑Once
71 )))|(% style="width:1164px" %)Гарантия доставки строго один раз.
72 Гарантия отсутствия потерь и дублей.|(% style="width:1164px" %)Kafka transactions|(% style="width:1164px" %)
73 )))
74 |(% style="width:108px" %) |(% style="width:1326px" %)(((
75 |(% style="width:136px" %)TransactionalInbox|(% style="width:1216px" %)(((
76 |(% style="width:207px" %)Полный|(% style="width:991px" %)Хранится IdempotencyId каждого входящего сообщения (уникальный индекс), для дедубликации.
77 Полная защита от дублей (даже если это несколько сообщений, с одинаковым ключом).
78 |(% style="width:207px" %)Только offset (облегченный)|(% style="width:991px" %)Специфично для kafka. Храниться только topic+partition+offset.
79 Защищает только от потери смещения (сообщение обработано, но offset не закомичен) и consumer timeout. Не поможет при дублировании на отправке (более 1 сообщения).
80 |(% style="width:207px" %) |(% style="width:991px" %)
81 )))
82 |(% style="width:136px" %) |(% style="width:1216px" %)
83 )))
84 |(% style="width:108px" %) |(% style="width:1326px" %)Более строгие гарантии могут давать большие накладные расходы (пропускная способность и задержка доставки).
85
86 ----
87
88 ==== Внутренние ссылки: ====
89
90 ====== Дочерние страницы: ======
91
92 {{children/}}
93
94 ====== Обратные ссылки: ======
95
96 {{velocity}}
97 #set ($links = $doc.getBacklinks())
98 #if ($links.size() > 0)
99 #foreach ($docname in $links)
100 #set ($rdoc = $xwiki.getDocument($docname).getTranslatedDocument())
101 * [[$escapetool.xml($rdoc.fullName)]]
102 #end
103 #else
104 No back links for this page!
105 #end
106 {{/velocity}}
107
108 ----