Намунаи Saga ва муомилоти тақсимшуда
Намунаи Saga ва муомилоти тақсимшуда
1) Чаро сагҳо лозиманд
2PC классикӣ (бастани ду фаза) ба қадри кофӣ миқёспазир нест, дар зери нокомӣ ва захираҳои блок мураккаб аст. Ҳикоя раванди умумии тиҷоратро ба пайдарпаии амалиётҳои (қадамҳои) маҳаллӣ тақсим мекунад, ки ҳар кадоми онҳо мустақилона амал мекунанд. Дар ҳолати нокомӣ, қадамҳои минбаъда бекор карда мешаванд ва онҳое, ки аллакай ба анҷом расидаанд, бо амалиёти баръакс ҷуброн карда мешаванд.
Натиҷа: пайдарҳамии ниҳоиро бидуни бастани глобалӣ, зинда мондани баланд ва протоколи возеҳи барқароршавӣ идора мекунад.
2) Моделҳои асосӣ
2. 1 Оркестр
Ҳамоҳангсози махсуси сага қадамҳоро идора мекунад: фармонҳо мефиристад, посухҳо/рӯйдодҳоро интизор мешавад, ҷубронро оғоз мекунад.
Тарафдор: назорати мутамарказ, мушоҳидаҳои оддӣ, мӯҳлатҳои возеҳ. Омӯз: Ҷузъи ихтиёрӣ.
2. 2 Хореография
Ҳамоҳангсоз нест; хидматҳо ба рӯйдодҳои ҳамдигар вокуниш нишон медиҳанд ("Фармоиш дода шудааст
Тарафдор: Пайвасти заиф. Омӯз: пайгирӣ кардан душвортар аст, хатари "рақси марг" бидуни қоидаҳои возеҳ.
2. 3 TCC (Кӯшиш кунед/Тасдиқ кунед/Бекор кунед)
Интихоб бо захираҳои "яхкунӣ":1. Кӯшиш кунед - омодагӣ/захира,
2. Тасдиқ - ислоҳ,
3. Бекор кардан - бозгашт.
Кафолатҳо баландтаранд, аммо шартномаҳо ва танаффуси захиравӣ мураккабтаранд.
3) Шартномаҳои қадам ва ҷуброн
Ҳар як қадам = амалиёти маҳаллӣ + ҷуброн (idempotent, такрорӣ имкон медиҳад).
Ҷуброн барои пурра баргардонидани ҷаҳон талаб карда намешавад - муодили домен кифоя аст (масалан, "пардохти бозгашт" ба ҷои "нест кардани пардохт").
Инвариантҳоро муайян кунед: барои пул - тавозун ба минус намерасад; барои фармоиш - мақоми "овезон" нест.
Мӯҳлатҳо/захираҳои TTL ва "ҷамъоварии партовҳо" -ро барои кӯшиши дерина ворид кунед.
4) Семантикаи мутобиқат ва таҳвил
Расонидани паём: ҳадди аққал як маротиба (бо нобаёнӣ) → ҳамаи амалиётҳо бояд idempotent бошанд.
Фармоиш: аз рӯи калиди коррелятсия муҳим аст (масалан, 'order _ id', 'player _ id').
Маҳз як бор ҳадафи саёҳат нест; мо ба якрангии муассир тавассути калидҳои idempotent, outbox/паёмдони қуттӣ ва супориши дуруст ноил мешавем.
5) Ҳолати саёҳат ва сабти он
Чиро бояд нигоҳ дошт:- 'saga _ id', 'correlation _ id', ҳолати ҷорӣ (Иҷро/Анҷом/Ҷуброн/Ҷуброншаванда/Нокомӣ),
- қадам ва тағирёбандаҳои он (ID пардохт/захиравӣ),
- таърих (сабти ном) -и ҳодисаҳо/қарорҳо, мӯҳлатҳо, мӯҳлатҳо, шумораи бозпурсӣ.
- Дӯкони алоҳидаи Saga (ҷадвал/ҳуҷҷат) барои ҳамоҳангсоз дастрас аст.
- Барои хореография - "агентҳои" маҳаллии саёҳат, нашри рӯйдодҳои вазъ дар мавзӯи умумӣ.
6) Намунаҳои боэътимоди нашр: outbox/паёмдони паём
Outbox: қадам тағиротро иҷро мекунад ва ҳодиса/фармонро ба ҷадвали берунӣ дар як амалиёт менависад; коргар ба шина нашр мекунад.
Қуттӣ: истеъмолкунанда ҷадвали коркардшудаи 'message _ id' → dedup + idempotency -ро нигоҳ медорад.
Пас аз таъсири бомуваффақияти тарафҳо ҷуброн карда мешавад/ACK (Kafka/RabbitMQ) - на пештар.
7) Тарроҳии қадамҳои саёҳат
7. 1 Намуна (хариди тиҷорати электронӣ/тиҷорати электронӣ)
1. Ҷойгиркунии тартибот → ҳолати 'PENDING'.
2. Авторизатсияи Пардохт (Кӯшиш кунед) → 'Пардохт _ hold _ id'.
3. Захираи Inventory → 'фармоиш _ id'.
4. Гирифтани пардохт (Тасдиқ).
5. Ба итмом расонидани фармоиш → 'Анҷом дода шуд'.
- агар (3) 'Бекор кардани Пардохт' → ноком шавад;
- (4) пас аз (3) → 'Нашри инвентаризатсия' ноком шуд;
- агар (5) 'Баргардонидани пардохт' ва 'Release
7. 2 Мӯҳлат/ақибнишинӣ
Ҳадди аксар N бо таъхири экспоненсиалӣ + jitter.
Пас аз барзиёд - ба 'Ҷуброн' равед.
Барои ҳар як қадам next_attempt_at ва deadline_at нигоҳ доред.
8) Оркестр vs платформа
Интихобҳо:- Оркестри сабуки хонагӣ (microservice + ҷадвали Saga).
- Платформаҳо: муваққатӣ/Cadence, Camunda, Netflix Conductor, Zeebe - вақтсанҷҳо, рейдҳо, ҷараёнҳои дарозмуддат, намоёнӣ ва веб-консол медиҳанд.
- Барои хореография каталоги рӯйдодҳо ва ҳолати қатъӣ/конвенсияи калидиро истифода баред.
9) Протоколҳои ҳамгироӣ
9. 1 Асинхронӣ (Кафка/Харгӯш)
Фармонҳо: 'пардохтҳо. иҷозат медиҳад. v1 ',' инвентаризатсия. захира. v1 '.
Чорабиниҳо: 'пардохтҳо. ваколатдор шудааст. v1 ',' инвентаризатсия. маҳфуз аст. v1 ',' пардохтҳо. асир гирифта шудааст. v1 ',' пардохтҳо. баргардонида шуд. v1 '.
Қисми калид = 'фармоиш _ id '/' player _ id' барои фармоиш.
9. 2 Синхронӣ (HTTP/GRPC) дар як қадам
Барои қадамҳои "кӯтоҳ" эътибор дорад, аммо ҳамеша бо танаффус/бозгашт/номутобиқатӣ ва бозгашт ба ҷуброни асинхронӣ.
10) Idempotence ва калидҳо
Дар дархостҳои фармон ва ҷуброн, pass 'idempotency _ key'.
Таъсири иловагӣ (навиштан ба пойгоҳи додаҳо/сабти ном) шартан иҷро карда мешавад: "иҷро кунед, агар шумо то ҳол 'idempotency _ key' -ро надида бошед".
Ҷубронпулӣ низ номувофиқ аст: такрори 'Пардохти пардохт (id = X)' бехатар аст.
11) Коркарди хатогӣ
Синфҳо:- Гузариш (шабакаҳо/вақтҳо) → бозгашт/бозгашт.
- Бизнес (маблағҳои нокифоя, маҳдудиятҳо) → ҷуброни фаврӣ/роҳи алтернативӣ.
- Дахолати дастӣ, ҷуброни дастӣ бебозгашт
- Сохтани матритсаи ҳалли: намуди хатогӣ → амал (такрор/ҷуброн/афзоиш).
12) Мушоҳида ва SLO sag
SLI/SLO:- Таъхири хотимавии саёҳат (p50/p95/p99).
- Сатҳи муваффақият.
- Вақти миёнаи ҷуброн кардани ҷубронпулӣ.
- Сагҳои ятим ва вақт ба GC.
- Пайгирӣ: 'trace _ id '/' saga _ id' ҳамчун пайванди байни қадамҳо; ченакҳои сатҳи сӯзондан барои буҷаҳои хатогӣ.
Гузоришҳо: ҳар як тағйири ҳолати сага = сабти сохторӣ бо сабабҳо.
13) Намунаҳо (псевдокод)
13. 1 Оркестр (идея)
python def handle(OrderPlaced e):
saga = Saga. start(e. order_id)
saga. run(step=authorize_payment, compensate=cancel_payment)
saga. run(step=reserve_inventory, compensate=release_inventory)
saga. run(step=capture_payment, compensate=refund_payment)
saga. run(step=finalize_order, compensate=refund_and_release)
saga. complete()
def run(step, compensate):
try:
step () # local transaction + outbox except Transient:
schedule_retry()
except Business as err:
start_compensation(err)
13. 2 Outbox (идеяи ҷадвал)
outbox(id PK, aggregate_id, event_type, payload, created_at, sent_at NULL)
inbox(message_id PK, processed_at, status)
saga(order_id PK, state, step, next_attempt_at, deadline_at, context JSONB)
saga_log(id PK, order_id, time, event, details)
13. 3 Хореография (ғояҳои мавзӯӣ)
'фармоишгарон. ҷойгир карда '→ истеъмолкунандагон: ' пардохтҳо. иҷозат ',' инвентаризатсия. захира '
'пардохтҳо. инвентаризатсияи ваколатдори '+'. фармоишҳои захирашудаи '→'. try_finalize'
Ҳама гуна нокомии фармоишҳои → '. ҷуброни пардохтҳои '→ оғозшуда'. бекор/баргардонидани ',' инвентаризатсия. озод кардан '.
14) Муқоиса бо 2PC ва ES
2PC: пайдарҳамии қавӣ, аммо басташавӣ, мушкилот, қубурҳои мис.
Saga: мувофиқати ниҳоӣ, ба шумо интизоми ҷуброн ва телеметрия лозим аст.
Сарчашмаи чорабинӣ: чорабиниҳоро ҳамчун манбаи ҳақиқат нигоҳ медорад; сагҳо дар он табиӣ мебошанд, аммо ба муҳоҷират/лаҳзаҳо мушкилӣ илова мекунанд.
15) Бехатарӣ ва риояи
Амнияти нақлиётӣ (TLS/MTLS), ACL дар як мавзӯъ/навбат.
Дар чорабиниҳо - ҳадди аққал PII, рамзгузории майдонҳои ҳассос, токенизатсия.
Дастрасии аудит ба сагҳо ва гузоришҳои ҷубронпулӣ.
SLA бо провайдерҳои беруна (пардохт/таҳвил) = мӯҳлати ниҳоӣ ва бозгардонидани параметрҳои маҳдудият.
16) Рӯйхати санҷиши амалисозӣ (0-45 рӯз)
0-10 рӯз
Равандҳои номзадро интихоб кунед (бисёрсоҳавӣ, ҷуброншаванда).
Моделро (оркестр/хореография/TCC) ва калиди коррелятсияро интихоб кунед.
Қадамҳо/ҷубронҳо, инвариантҳо ва мӯҳлатҳоро тавсиф кунед. Ҷадвалҳои 'saga', 'outbox', 'паёмдони' -ро баланд кунед.
11-25 рӯз
Қуттӣ/паёмдони қуттӣ, idempotency ва бозгаштро дар бар гиред.
Аввалин sagas Deploite; панели SLI/SLO илова кунед ва пайгирӣ кунед.
Дафтарчаи ҷубронпулӣ (аз ҷумла дастур) ва шиддатро нависед.
26-45 рӯз
Худкори GC sagas "овезон", бозоғозии даврӣ/идомаи мӯҳлат.
Рӯзи бозиро сарф кунед: нокомии қадам, мӯҳлати барзиёд, дастнорас будани брокер.
Стандартикунонии шартномаҳои рӯйдодҳо (версияҳо, мутобиқат), насб кардани "директорияи saga".
17) Анти-намунаҳо
"Ҷуброн = нест кардан аз пойгоҳи додаҳо" ба ҷои амали домени дурусти баръакс.
Не outbox/паёмдони § аз даст додани рӯйдодҳо/эффектҳои дугона.
Retrai бе jitter → вобастагии худидоракунии DD.
Интизории пайдарҳамии қавии хондан бидуни "коркард идома дорад"....
Як оркестри азим барои ҳама → монолитҳои назоратӣ.
Хореографияи умумӣ бидуни намоён ва SLA → рақси идоранашаванда.
Сарфи назар кардани мӯҳлатҳо → захираҳои абадӣ/нигоҳдорӣ.
18) Нишондиҳандаҳои камолот
≥ 90% равандҳои интиқодӣ бо сагҳо/ҷубронпулӣ фаро гирифта шудаанд ва инвариантҳои тавсифшударо доранд.
Outbox/паёмдони қуттӣ барои ҳамаи истеҳсолкунандагон/истеъмолкунандагони Tier-0/1 муттаҳид карда шудааст.
SLO: p95 достони ниҳоӣ муқаррарӣ аст, сатҳи муваффақият устувор аст, ҳадафи ятим <.
Пайгирии шаффоф ва панелҳои "дар қадамҳо", огоҳиҳои сӯхтан.
Санҷиши ҷубронпулии семоҳаи бозӣ ва дастӣ.
19) Хулоса
Saga як шартномаи амалии ҳамоҳангӣ барои системаҳои тақсимшуда мебошад: қадамҳои возеҳ ва амалҳои баръакс, интишори интизом (қуттиҳо/паёмдонҳо), мӯҳлатҳо ва бозпурсӣ, мушоҳида ва равандҳои ҷуброн. Моделро интихоб кунед (оркестр/хореография/TSS), инвариантҳо ва калидҳоро ислоҳ кунед, коркардкунандагонро бефоида созед - ва равандҳои тиҷорати бисёрсоҳавии шумо бидуни 2PC гарон пешгӯишаванда ва устувор мешаванд.