Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Данил Арендарский — Реализация паттерна Outbox ...
Search
Ozon Tech
March 28, 2023
Technology
0
1.9k
Данил Арендарский — Реализация паттерна Outbox для Apache Kafka
Ozon Tech
March 28, 2023
Tweet
Share
More Decks by Ozon Tech
See All by Ozon Tech
Анастасия Писнова, «Текст как проект»
ozontech
0
32
Светлана Каюшина, Автоматизируем документирование и внедряем ИИ
ozontech
0
48
Павел Костромитин, «Что случилось у UXW T-Банка в 2024 »
ozontech
0
72
Сергей Горшенин, «Конвертация данных Ozon»
ozontech
0
44
Юрий Гуреев, «Интеграция 1С с внешними системами. Проблемы и их решения»
ozontech
0
79
Артём Нургалиев, «Кэш на кэш: как ускоряли автобиддеры»
ozontech
0
41
Анна Мария Попова (Х5 Tech) – Фантастический техпис: может ли опыт создания художественных книг помочь в написании документации
ozontech
0
220
Александр Мачулин (Gramax) – Справочник фантастических тварей из Docs as Code
ozontech
0
230
Мария Смирнова – Дзен и искусство работы с документацией: как использовать принципы буддизма в работе техписа
ozontech
0
170
Other Decks in Technology
See All in Technology
GraphRAG グラフDBを使ったLLM生成(自作漫画DBを用いた具体例を用いて)
seaturt1e
1
110
Introduction to Bill One Development Engineer
sansan33
PRO
0
300
CREが作る自己解決サイクルSlackワークフローに組み込んだAIによる社内ヘルプデスク改革 #cre_meetup
bengo4com
0
290
NLPコロキウム20251022_超効率化への挑戦: LLM 1bit量子化のロードマップ
yumaichikawa
1
190
Okta Identity Governanceで実現する最小権限の原則 / Implementing the Principle of Least Privilege with Okta Identity Governance
tatsumin39
0
160
アウトプットから始めるOSSコントリビューション 〜eslint-plugin-vueの場合〜 #vuefes
bengo4com
3
310
事業開発におけるDify活用事例
kentarofujii
5
1.3k
AIフル活用で挑む!空間アプリ開発のリアル
taat
0
140
ローカルLLMとLINE Botの組み合わせ その2(EVO-X2でgpt-oss-120bを利用) / LINE DC Generative AI Meetup #7
you
PRO
0
140
Azureコストと向き合った、4年半のリアル / Four and a half years of dealing with Azure costs
aeonpeople
1
250
AI駆動で進める依存ライブラリ更新 ─ Vue プロジェクトの品質向上と開発スピード改善の実践録
sayn0
1
110
ソースを読むプロセスの例
sat
PRO
15
9.8k
Featured
See All Featured
How GitHub (no longer) Works
holman
315
140k
Building an army of robots
kneath
305
46k
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
657
61k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
9
930
Context Engineering - Making Every Token Count
addyosmani
7
300
A designer walks into a library…
pauljervisheath
209
24k
A Modern Web Designer's Workflow
chriscoyier
697
190k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
10
880
Learning to Love Humans: Emotional Interface Design
aarron
274
41k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
16k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.7k
Transcript
Ozon Tech 2023 Данил Арендарский, старший разработчик в отделе центральных
логистических систем
2
3
4 Проверили ключ идемпотентност и
5 Распределили нагрузку по подам
6
Pod 1 Pod 3 Pod 2 Пачка данных 1 Пачка
данных 2 Пачка данных 3 ? 7 Partition 0 Partition 1 Partition 2 Kafka Pod leader Produce
8
9
Failed Превышено количество попыток Дата следующей попытки Pending Handled Processing
10
11 статус = Pending дата следующей попытки текущей Ретрай статус
= Pending
12 На примере проекта по выдаче заказов курьерам
13
14 Кладовщик запустил завершение выдачи Создали перевозку Сформировали документы по
выдаче … Завершили выдачу
Топик выдач на завершение inbox_message ( , topic, key, payload)
outbox_request (id, , type , status, attempt, next_attempt_date) * : Создать документы Создать перевозку … 15
16
17
18
19
20
21
Hosted Service PostgreSQL 22 BEGIN; SELECT FOR UPDATE FROM outbox_request
WHERE status = Pending, next_attempt_date < now(); Kafka { "OutboxRequestId": 1 } Produce outbox_request.id UPDATE status = Processing; END;
23
24
25
26
27
28
29
Kafka outbox_request.id PostgreSQL Pod SELECT FOR UPDATE FROM outbox_request WHERE
status = Processing, id = :id Consume 30
Kafka PostgreSQL Pod Handle SELECT FOR UPDATE FROM outbox_request WHERE
status = Processing, id = :id outbox_request.id Consume UPDATE status = Handled/Failed/Pending, attempt_date = now() + interval 31
32
33
34
35
36
37
38
39
40
41
42
43
Shard 1 Shard 2 44 Entity bucket_id Алгоритм шардирования Service
Bucket 1 Bucket 2 Bucket 3 Bucket 4
Pod 1 Pod 3 Pod 2 45 Partition 0 Partition
1 Partition 2 Kafka Pod leader Produce
Pod 1 Pod 3 Pod 2 46 Shard 1 Bucket
1 Bucket 2 Shard 2 Bucket 3 Bucket 4 Partition 0 Partition 1 Partition 2 Kafka Pod leader Produce
47 Shard 1 Bucket 1 Bucket 2 Shard 2 Bucket
3 Bucket 4 Pod 3 Pod 2 etcd/Zookeper/Redis Pod 1
Telegram: @arendarskydd Спасибо за внимание Данил Арендарский, старший разработчик в
отделе центральных логистических систем