Sagas ва муомилоти тақсимшуда
Сага як амалиёти дарозмуддати тиҷоратист, ки ба пайдарпаии қадамҳои маҳаллӣ дар байни хизматрасониҳо/анборҳои гуногун тақсим шудааст. Ҳар як қадам амали ҷубронпулӣ дорад, ки таъсири қадамро дар шикасти қисман бозмедорад. Баръакси 2PC/3PC, сагҳо қуфлҳои глобалиро нигоҳ намедоранд ва барои microservices, бисёр минтақаҳо ва борҳои баланд мувофиқанд, ки мувофиқати ниҳоӣ қобили қабул аст.
1) Кай интихоб кардани сагҳо (ва вақте ки не)
Мувофиқат:- Равандҳои бизнеси дарозмуддат/бисёрқадамӣ (фармоиш → пардохт → захира → таҳвил).
- Доменҳо ва анборҳои гуногун, ки дар он ҷо амалиёти умумӣ вуҷуд надорад.
- Ба дастрасии баланд ва миқёс ниёз дорад.
- Атоми сахти ACID муҳим аст (масалан, интиқоли миқдори калон дар як феҳрист).
- Ҷуброни дақиқ вуҷуд надорад (шумо наметавонед "захира" кунед ё натиҷаро бекор кунед).
- Маҳдудиятҳои ҳуқуқӣ/меъёрӣ ҷудокунии қатъӣ ва "фаврӣ" -ро талаб мекунанд.
2) Моделҳои Sagas
1. Оркестри Saga - Ҳамоҳангсози марказӣ қадамҳо ва ҷубронро идора мекунад.
Тарафдор: ҷараёни возеҳ, назорати хатогӣ, телеметрияи соддакардашуда.
Омӯз: нуқтаи мутамарказ, хатари ҳамоҳангсози "фарбеҳ".
2. Хореография (Хореография): ягон марказ - қадамҳо бо ташаббуси чорабиниҳо оғоз карда мешаванд ("хидмати A оё X → хидмати В вокуниш нишон медиҳад").
Тарафдор: пайвасти заиф, миқёси оддӣ.
Омӯз: пайгирӣ/ислоҳи ҷараён, хатари "вайроншавии" қоидаҳо мушкилтар аст.
3. TCC (Кӯшиш кунед, тасдиқ кунед/бекор кунед) - Ҳар як қадам "Кӯшиш кунед", пас тасдиқ ё бекор кунед.
Тарафдор: наздиктар ба протоколи псевдо-ду фаза, захираҳои идорашаванда.
Омӯз: дар татбиқи интерфейсҳо гаронтар; Вақтсанҷи дорандагони "Кӯшиш кунед" -ро талаб мекунад.
3) Тарҳи қатрон ва ҷуброн
Инвариантҳо: ба таври возеҳ нишон медиҳанд, ки пеш аз/баъд аз қадам чӣ бояд рост бошад (масалан, "боқимонда ≥ 0").
Ҷуброн ≠ муомилоти баръакс: ин амали мантиқист, ки таъсири тиҷоратро бекор мекунад (баргардонидан, озод кардан, барқарор кардан).
Idempotence: ҳам қадам ва ҳам ҷуброн бояд бехатар такрор карда шаванд (бо 'operation _ id').
Вақтсанҷҳо: ҳар як қадам мӯҳлат дорад; таъхир ҷубронро ба вуҷуд меорад.
Таъсири барнагардонидан: онҳоро алоҳида сабт кунед (огоҳиҳо, почтаи электронӣ) ва ба "саъю кӯшиши беҳтарин" имкон диҳед.
4) Мувофиқат ва тартибот
Мувофиқати оқибат: корбарон ихтилофи вақтро дида метавонанд; UX - бо "интизор "/spinners/statuses.
Фармоиш аз рӯи калид - Гурӯҳбандии қадамҳои гузариш аз рӯи калиди бизнес (order_id) барои фармоиш додани рӯйдодҳо.
Deduplication - Сабти коркардро ('operation _ id' → status) бо TTL нигоҳ доред.
5) Нақлиёт ва эътимоднокӣ
Намунаи Outbox-Ҳодисаро ба ҷадвали баромади маҳаллӣ дар ҳамон як амалиёт менависад ва сипас асинхронӣ онро ба автобус нашр мекунад.
Дӯкони паёмдони/Idempotency: дар тарафи истеъмолкунанда - сабти паёмҳо аллакай коркард шудааст.
Маҳз як маротиба самаранок: "outbox + истеъмолкунандаи номатлуб" амалияи "як маротиба" медиҳад.
DLQ: барои паёмҳои "заҳролуд" бо мета-иттилооти бой ва redrive бехатар.
6) Хатогӣ, бозпас гирифтан, сиёсати бозгашт
Мо танҳо қадамҳои номатлубро такрор мекунем; амалиёти навиштан - бо 'Idempotency-Key'.
Бозгашти экспоненсиалӣ + ҷиттер; маҳдуд кардани кӯшишҳо ва мӯҳлати ҷамъбастии саёҳат.
Бо таназзули системавӣ - Қатъи гардиш ва таназзули зебо (масалан, қисми дуввуми афсонаро бекор кунед).
Низоъҳои корӣ ('409') - пас аз оштӣ ё ҷуброн кардан ва хотима ёфтан.
7) Оркестр: Масъулият ва сохтор
Вазифаҳо:- Пайгирии ҳолати саҷда: 'Интизорӣ → Иҷро кардан → Ҷуброн → Иҷро/Иҷро шуд/НОКОМ'.
- Банақшагирии қадамҳо, мӯҳлатҳо, танаффусҳо, ақибнишинӣ.
- Хатсайрҳои чорабинӣ ва оғози ҷуброн.
- Идемпотенсияи амалиёти ҳамоҳангсоз (сабти фармон).
- Мушоҳида: таносуби 'saga _ id' дар гузоришҳо/пайгирӣ/ченакҳо.
- Ҷадвалҳои 'saga', 'saga _ step', 'фармонҳо', 'outbox'.
- Индексҳо дар 'saga _ id', 'business _ key', 'status', 'next _ run _ at'.
8) Хореография: қоидаҳо ва муҳофизат аз "кӯлулаи барфӣ"
Шартномаҳои чорабинӣ: схемаҳо ва версияҳо (Avro/Proto/JSON Schema).
Семантикаи тоза: "далели ҳодиса" vs "фармон".
Қатъи занҷир: хидмат, номувофиқатиро ошкор карда, як чорабинии 'Failed '/' Ҷуброн' -ро нашр мекунад.
Ҳушдорҳо ва ҳушдорҳо дар бораи "ҳалқаҳои беохир".
9) TCC: тафсилоти амалӣ
Кӯшиш кунед: захираи захираҳо бо TTL.
Тасдиқ: содир кардан, озод кардани қуфлҳои муваққатӣ.
Бекор: баргардонидани захира (бе таъсири тараф).
Ҷамъоварии партовҳо: бекоркунии худкори Кӯшиш кунед пас аз TTL (бекоркунии idempotent).
Тасдиқ/Бекор кардани idempotent: такрор бехатар аст.
10) Мисол (нақшаи калимаҳо) - "Фармоиш бо пардохт ва таҳвил"
1. Эҷод кардани фармоиш (маҳаллӣ) → outbox: 'Фармоиш'.
2. Хизматрасонии пардохт: 'Кӯшиш кунед' захира (TCC); агар § 'Пардохтҳои захирашуда', агар 'Payment' номуваффақ бошад.
3. Инвентаризатсия: захираи маҳсулот; аз § 'Инвентаризатсия'.
4. Хадамоти интиқол - Эҷоди ковокии таҳвил (бекор карда мешавад).
5. Агар ягон қадами 'Failed' → оркестр ҷубронро бо тартиби баръакс оғоз кунад: 'Бекор кардани интиқол' → 'Инвентаризатсия' → 'Пардохт'.
6. Агар ҳама хуб бошанд → 'Payment
11) Псевдокоди оркестр
pseudo startSaga(saga_id, order_id):
steps = [ReservePayment, ReserveInventory, BookShipment, ConfirmPayment]
for step in steps:
res = execWithRetry(step, order_id)
if!res.ok:
compensateInReverse(steps_done(order_id))
return FAIL return OK
execWithRetry(step, key):
for attempt in 1..MAX:
try:
return step.run(key) # идемпотентно catch RetryableError:
sleep(backoff(attempt))
catch NonRetryableError:
return FAIL return FAIL
compensateInReverse(done_steps):
for step in reverse(done_steps):
step.compensate() # идемпотентно
12) SLO-ҳои мушоҳидашаванда ва амалиётӣ
Пайгирӣ: ягона 'saga _ id', эзоҳҳо 'қадам', 'кӯшиш', 'қарор' (иҷро/ҷуброн/гузаштан).
Нишондиҳандаҳо:- Муваффақият/хатогии sagas (%), давомнокии миёна, p95/p99.
- Ҳиссаи афсонаҳои ҷуброншуда, сабабҳои асосии ҷуброн.
- Queues/outbox қафо мемонад, дар қадамҳо қадам мезанад.
- Гузоришҳо/аудитҳо: қарорҳои оркестрӣ, идентификаторҳои захираҳо, калидҳои корӣ.
13) Озмоиш ва бетартибӣ
Ворид кардани хатогиҳо ба ҳар як қадам: танаффус, '5xx', муноқишаҳои корӣ.
Ҳодисаҳои фармоишӣ, нусхабардорӣ, қатраҳо.
Думҳои дарозмуддати ниҳонӣ → санҷиши мӯҳлатҳо ва ҷубронҳо.
Сагҳои оммавӣ → санҷиши WFQ/DRR ва ҳадди аққал дар навбат, набудани "басташавии сари хат".
Redrave аз DLQ дар қадамҳо ва дар як саҷда.
14) Иҷораи бисёр, минтақаҳо, мувофиқат
Барчаспҳои 'иҷорагир _ id/plan/region' in чорабиниҳо ва анборҳои сага.
Истиқомат: маълумот/чорабиниҳо минтақаро тарк намекунанд; сагҳои байниминтақавӣ ҳамчун федератсияҳои сагҳои маҳаллӣ + чорабиниҳои маҷмӯӣ тарҳрезӣ шудаанд.
Афзалият: Сагҳои VIP вазни бештари квота доранд; ҷудокунии коргарон ба як иҷорагир.
15) Рӯйхати санҷиши пеш аз фурӯш
- Ҳар як қадам ҷубронкунандаи возеҳ дорад ва ҳарду номутаносиб мебошанд.
- Қолаби интихобшуда: оркестр/хореография/TSS; маҳдудиятҳои масъулият тавсиф карда мешаванд.
- Outbox/Inbox татбиқ карда мешавад, такрорӣ аз ҷониби 'operation _ id'.
- Сиёсати бозгашт: бозгашт бо ҷиттер, маҳдудиятҳо ва мӯҳлати умумии саёҳат.
- Шартномаҳои ҳодиса санҷида мешаванд, тасдиқи нақша мавҷуд аст.
- DLQ ва Release Secure танзим карда шудаанд.
- Телеметрия: ченакҳо, пайгирӣ, таносуби 'saga _ id'.
- Китобҳои амалиётӣ: бекор кардани дастӣ/force-тасдиқ, кушодани сагҳои "овезон".
- Санҷишҳои бетартибӣ ва сарборӣ мегузаранд, буҷаи SLO/хатогӣ муайян карда шудааст.
16) Хатогиҳои маъмулӣ
Ягон ҷубронкунанда вуҷуд надорад ё он "нопок" аст (таъсири манфӣ дорад).
Ягон idempotence/dedup вуҷуд надорад - дугоникҳо ва "тағйири" давлатҳо.
"Saga in Saga" бидуни марзҳои возеҳ - давраҳо ва қуфлҳои мутақобила.
Ҳеҷ гуна мӯҳлатҳо ва ихроҷи манбаъҳои "абадӣ" вуҷуд надоранд.
Оркестр давлатро "дар хотира" бидуни мағозаи устувор нигоҳ медорад.
Хореография бидуни маркази телеметрия → нокомии "ноаён".
Opaque UX: Истифодабарандагон ҳолати фосилавиро намебинанд.
17) Дорухатҳои зуд
Классикони SAA: оркестр + outbox/паёмдони қуттӣ, пушти экспоненсиалӣ, DLQ, статусҳо дар UI.
Инвариантҳои қавӣ: TCC бо захираи TTL ва GC Бекор.
Ҳаҷми баланд/сарборӣ: хореографияи рӯйдодҳо + номутобиқатии қатъӣ ва ченакҳои асосӣ.
Бисёр минтақаҳо: сагҳои маҳаллӣ + агрегатҳои ниҳоӣ; аз қуфлҳои ҷаҳонӣ канорагирӣ кунед.
Хулоса
Сагҳо як роҳи ба даст овардани пайдарҳамии пешгӯишаванда дар системаҳои тақсимшуда бидуни қуфлҳои ҷаҳонӣ мебошанд. Ҷубронпулии возеҳ, аблаҳӣ, таҳвили боэътимод (қуттиҳо/паёмдонҳо), интизоми вақт ва бозсозӣ, инчунин телеметрия ва дафтарҳои бозӣ калиди таъмини устувории равандҳои мураккаби тиҷорат бо афзоиши сарборӣ, шумораи хидматҳо ва ҷуғрофия мебошанд.