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.5k
Данил Арендарский — Реализация паттерна Outbox для Apache Kafka
Ozon Tech
March 28, 2023
Tweet
Share
More Decks by Ozon Tech
See All by Ozon Tech
Сергей Горшенин, «Конвертация данных Ozon»
ozontech
0
14
Юрий Гуреев, «Интеграция 1С с внешними системами. Проблемы и их решения»
ozontech
0
37
Артём Нургалиев, «Кэш на кэш: как ускоряли автобиддеры»
ozontech
0
14
Анна Мария Попова (Х5 Tech) – Фантастический техпис: может ли опыт создания художественных книг помочь в написании документации
ozontech
0
170
Александр Мачулин (Gramax) – Справочник фантастических тварей из Docs as Code
ozontech
0
120
Мария Смирнова – Дзен и искусство работы с документацией: как использовать принципы буддизма в работе техписа
ozontech
0
110
Сергей Кузнецов – «Эксперименты с нейросетями в рекомендациях»
ozontech
0
110
Артём Нургалиев – «MLOps, автоматизированное обучение и доставка моделей»
ozontech
0
97
Артём Панин – «Автоматическое управление рекламой в Ozon»
ozontech
0
110
Other Decks in Technology
See All in Technology
[CV勉強会@関東 ECCV2024 読み会] オンラインマッピング x トラッキング MapTracker: Tracking with Strided Memory Fusion for Consistent Vector HD Mapping (Chen+, ECCV24)
abemii
0
230
SDN の Hype Cycle を一通り経験してみて思うこと / Going through the Hype Cycle of SDN
mshindo
1
180
SREが投資するAIOps ~ペアーズにおけるLLM for Developerへの取り組み~
takumiogawa
2
820
プロダクト活用度で見えた真実 ホリゾンタルSaaSでの顧客解像度の高め方
tadaken3
0
220
CysharpのOSS群から見るModern C#の現在地
neuecc
2
3.6k
【令和最新版】AWS Direct Connectと愉快なGWたちのおさらい
minorun365
PRO
5
780
Why App Signing Matters for Your Android Apps - Android Bangkok Conference 2024
akexorcist
0
130
SDNという名のデータプレーンプログラミングの歴史
ebiken
PRO
2
160
誰も全体を知らない ~ ロールの垣根を超えて引き上げる開発生産性 / Boosting Development Productivity Across Roles
kakehashi
2
240
Flutterによる 効率的なAndroid・iOS・Webアプリケーション開発の事例
recruitengineers
PRO
0
130
AWS Lambda のトラブルシュートをしていて思うこと
kazzpapa3
2
200
LINEヤフーにおけるPrerender技術の導入とその効果
narirou
1
210
Featured
See All Featured
How to Think Like a Performance Engineer
csswizardry
20
1.1k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
42
9.2k
Navigating Team Friction
lara
183
14k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
4
380
GraphQLとの向き合い方2022年版
quramy
43
13k
Designing Experiences People Love
moore
138
23k
Documentation Writing (for coders)
carmenintech
65
4.4k
Imperfection Machines: The Place of Print at Facebook
scottboms
265
13k
Embracing the Ebb and Flow
colly
84
4.5k
4 Signs Your Business is Dying
shpigford
180
21k
Mobile First: as difficult as doing things right
swwweet
222
8.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
325
24k
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 Спасибо за внимание Данил Арендарский, старший разработчик в
отделе центральных логистических систем