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
2.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Данил Арендарский — Реализация паттерна Outbox для Apache Kafka
Ozon Tech
March 28, 2023
More Decks by Ozon Tech
See All by Ozon Tech
Анастасия Писнова, «Текст как проект»
ozontech
0
75
Светлана Каюшина, Автоматизируем документирование и внедряем ИИ
ozontech
0
87
Павел Костромитин, «Что случилось у UXW T-Банка в 2024 »
ozontech
0
160
Сергей Горшенин, «Конвертация данных Ozon»
ozontech
0
84
Юрий Гуреев, «Интеграция 1С с внешними системами. Проблемы и их решения»
ozontech
0
110
Артём Нургалиев, «Кэш на кэш: как ускоряли автобиддеры»
ozontech
0
74
Анна Мария Попова (Х5 Tech) – Фантастический техпис: может ли опыт создания художественных книг помочь в написании документации
ozontech
0
260
Александр Мачулин (Gramax) – Справочник фантастических тварей из Docs as Code
ozontech
0
280
Мария Смирнова – Дзен и искусство работы с документацией: как использовать принципы буддизма в работе техписа
ozontech
0
210
Other Decks in Technology
See All in Technology
10年目を迎えた「ABEMA」がどのように AI 活用を推進して、AI 駆動開発にシフトしているのか / How ABEMA, entering its 10th year, is promoting the use of AI and shifting toward AI-driven development
miyukki
0
310
Multicaで30個のミニプロジェクトをAIエージェント運用して見えてきたこと
eiei114
0
540
「顧客の声を聞かなければ何も始まらない」 ── 顧客の声から生まれた『AI返信補助機能』の開発プロセス / AICon2026_shikata_imai
rakus_dev
0
220
インフラと開発の垣根を超えていき!〜元AWSインフラエンジニアがAWS開発で奮闘している話〜
hatahata021
3
320
Alphaモジュール使っていいのかい!?いけないのかい!?どっちなんだいっ!?
watany
1
300
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
590
ruby.wasmとPicoRuby.wasmに対応した仮想DOMライブラリを作ってる話 #kaigieffect_kaigi
sue445
PRO
0
160
AICoEでAIネイティブ組織への進化
yukiogawa
0
210
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
2
970
ボーイスカウトルールでメモリやスキルを改善しよう
azukiazusa1
4
1.5k
穢れた技術選定について
watany
18
5.8k
OpenTelemetryにおけるGoのゼロコード・コンパイル時計装について #fukuokago
quiver
0
160
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Are puppies a ranking factor?
jonoalderson
1
3.7k
Ruling the World: When Life Gets Gamed
codingconduct
0
280
GraphQLとの向き合い方2022年版
quramy
50
15k
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
400
Bootstrapping a Software Product
garrettdimon
PRO
307
120k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
Automating Front-end Workflow
addyosmani
1370
210k
The Spectacular Lies of Maps
axbom
PRO
1
860
The untapped power of vector embeddings
frankvandijk
2
1.8k
Thoughts on Productivity
jonyablonski
76
5.2k
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 Спасибо за внимание Данил Арендарский, старший разработчик в
отделе центральных логистических систем