Saga-pattern և բաշխված գործարքներ
Saga-pattern և բաշխված գործարքներ
1) Ինչո՞ ւ սագայի կարիքը կա
Դասական 2PC (երկտեղանոց ամրագրումը) վատ է, կազմված է բացթողումների տակ և արգելափակում է ռեսուրսները։ Սագան կոտրում է ընդհանուր բիզնես գործընթացը տեղական գործարքների հաջորդականության համար (քայլեր), որոնցից յուրաքանչյուրը անկախ է։ Երբ հաջորդ քայլերը ձախողվում են, իսկ արդեն կատարված քայլերը փոխհատուցվում են հակառակը։
Արդյունքը 'կառավարվող eventum consistency առանց համաշխարհային արգելափակման, բարձր գոյատևման և վերականգնման հստակ արձանագրություն։
2) Հիմնական մոդելները
2. 1 Նվագախումբ
Ընտրված ռուսական սագան կառավարում է քայլերը 'ուղարկում է թիմերին, սպասում է պատասխաններ/իրադարձություններ, նախաձեռնում է փոխհատուցում։
Պլյուսներ ՝ կենտրոնացված վերահսկողություն, պարզ դիտարկում, ակնհայտ dedlines։ Մինուսներ 'ավելացված բաղադրիչ։
2. 2 Խորեոգրաֆիա
Ո՛ չ։ ծառայությունները արձագանքում են միմյանց իրադարձություններին («Orte Placed»)։
Պլյուսներ 'թույլ կապը։ Մինուսներ 'ավելի դժվար է գտնել, «մահվան պարի» ռիսկը առանց հստակ կանոնների։
2. 3 TCC (Try-Confirm/Cancel)
Ռեսուրսների «սառեցման» տարբերակը
1. Try - պատրաստություններ/պահեստներ,
2. Systirm - ամրագրում,
3. Cancel-ը արձագանք է։
Երաշխիքները ավելի բարձր են, բայց ավելի դժվար են պայմանագրերը և պահուստների թայմաուտները։
3) Քայլերի և փոխհատուցման պայմանագրեր
Յուրաքանչյուր քայլ = տեղական գործարք + փոխհատուցում (idempotent, թույլ է տալիս կրկնօրինակը)։
Փոխհատուցումը պարտավոր չէ ամբողջովին «վերադարձնել աշխարհը», բավականին անկայուն համարժեք (օրինակ ՝ «վճարումը» փոխարենը «հեռացնել վճարումները»)։
Intinvariants: փողի համար հավասարակշռությունը չի գնում մինուս; պատվերների համար չկա «կախված» արձաններ։
Ներկայացրեք/TTL պահուստները և «garbage collector» -ը ժամկետանց փորձերի համար։
4) Առաքման համաձայնությունն ու իմաստությունը
Հաղորդագրությունների առաքումը 'at-leport-once (defolt), բոլոր վիրահատությունները պետք է լինեն idempotent։
Կարգը 'կարևոր է հարաբերական բանալին (օրինակ ՝ «order _ id», «player _ id»)։
Exactly-once-ը սագայի նպատակը չէ։ մենք ստանում ենք արդյունավետ միանվագ-միանվագ բանալիների միջոցով, www.box/inbox և ճիշտ հաղորդակցման միջոցով։
5) Սագայի վիճակը և նրա ծուղակը
Ի՞ նչ պահել
«saga _ id», «www.relation _ id», ներկա կարգավիճակը (Running/Completed/Compronating/Compronated/Failed),
քայլը և դրա իրականացումը (IDS վճարումներ/պահուստներ),
պատմություն (ամսագիր) իրադարձություններ/լուծումներ, թայմստեմպեր, dedline, retrage քանակը։
Որտեղ պահել
Առանձին Saga Store (112/փաստաթուղթ), հասանելի կոորդինացիա։
Խորեոգրաֆիայի համար տեղական «112» սագներ են, որոնք հրապարակում են կարգավիճակի իրադարձությունները ընդհանուր կացիններում։
6) Վստահելի հրատարակման պաթերոնները ՝ www.box/inbox
Windobox: քայլը է փոփոխություններին և գրում է իրադարձությունը/թիմը մեկ գործարքի մեջ wwww.box աղյուսակում։ գողերը հրապարակում է անվադողերի վրա։
Inbox: սպառողը առաջնորդում է վերամշակված «բանաձև _ id» աղյուսակը։
Հաջողակ կողմնակի ազդեցությունից հետո, որը պատկանում է set/ACK (Kafka/RabbitMQ), նախկինում չէ։
7) Սագայի քայլերի նախագծումը
7. 1 օրինակ (iGaming/e-commerce)
1. Plant Order-ը հաստատեց «PENDING» կարգավիճակը։
2. AuthorizePayment (Try) → `payment_hold_id`.
3. ReserveInventory → `reservation_id`.
4. CapturePayment (Confirm).
5. FinalizeOrder → `COMPLETED`.
Փոխհատուցում
(3) ձախողվեց «CancelPayme Hold»;
Եթե (4) ձախողվեց (3) «Releae Engentory» -ից հետո։
(5) ձախողվեց «RefundPayment» և «Releae Engentory»։
7. 2 Dedline/retray
Առավելագույն N retrav էքսպոնենցիալ ձգումով + ջիտթեր։
Ավելացումից հետո '«Compronating» -ի անցումը։
Պահեք next _ attempt _ at և deadult _ at յուրաքանչյուր կոդերի համար։
8) Նվագարկիչ vs պլատֆորմը
Տարբերակները
Հեշտ տնային նվագարկիչ (միկրովեռվիս + www.Saga)։
Պլատֆորմները ՝ Temensal/Cadence, Camunda, Netflix Conductor, Zeeebe, տալիս են թայմերներ, ռետրեր, երկար գոյատևող վորկֆլոն, տեսանելիություն և վեբ վահանակ։
Խորեոգրաֆիայի համար օգտագործեք իրադարձությունների կատալոգը և արձանների/բաների խիստ պայմանագիրը։
9) Արձանագրություններ
9. 1 Asinhrono (Kafka/RabbitMQ)
Թիմերը '<payments։ authorize. v1`, `inventory. reserve. v1`.
Իրադարձությունները '<payments։ authorized. v1`, `inventory. reserved. v1`, `payments. captured. v1`, `payments. refunded. v1`.
Կուսակցության բանալին = «order _ id »/« player _ id» կարգի համար։
9. 2 Սինխրոն (HTTP/gRPC) ներսում
Ընդունելի է «կարճ» քայլերի համար, բայց միշտ 'թայմաուտների/ռետալների/իդեմպոտենտիզմի և ֆալբանկի հետ ասինխրոն։
10) Գաղափարախոսություն և բանալիներ
Հրամանների և փոխհատուցումների պահանջներում փոխանցեք «idempotency _ key»։
Կողմնակի էֆեկտները (ձայնագրությունը BD/դուրս) կատարվում են պայմանականորեն. <<Կատարել, եթե դեռ չեք տեսել
Փոխհատուցումը նույնպես հակադարձ է. «RefundPayment (id = X)» անվտանգ է։
11) Սխալների վերամշակում
Դասարաններ
Transient (ցանցեր/թայմաուտներ) wwww.retrai/backoff.
Business (բավարար միջոցներ, լիմիտներ) ռուսական փոխհատուցում/այլընտրանքային ճանապարհ։
Irrecoverable (invarium խախտումը) կատարվում է ձեռքով միջամտություն, «ձեռքով» փոխհատուցում։
Տեղադրեք որոշումների մատրիցը 'սխալի տեսակը (retry/comporate/escalate)։
12) Դիտողությունն ու SLO սագը
SLI/SLO:- End-to-end latency sagi (p50/p95/p99)։
- Success rate (ավարտված մասը առանց փոխհատուցման)։
- Mean time to compensate и compensation rate.
- Orphaned sagas (կախված) և ժամանակը մինչև GC։
- Ուղիներ ՝ «trace _ id »/« saga _ id» որպես քայլերի միջև շարժիչ։ burn-rate պիտակները սխալների համար։
Լոգի 'սագայի կարգավիճակի յուրաքանչյուր փոփոխություն = կառուցվածքային ձայնագրությունը պատճառի հետ։
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 Nobox (աղյուսակի գաղափարը)
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 Խորեոգրաֆիա (գաղափարներ թեմաներով)
`orders. placed 'ռուսական սպառողները' "payments։ authorize`, `inventory. reserve`
`payments. authorized` + `inventory. reserved` → `orders. try_finalize`
Ցանկացած մերժում 'orders։ www.compate '2019-ը նախաձեռնվում է «payments»։ cancel/refund`, `inventory. release`.
14) Համեմատություն 2PC և ES-ի հետ
2PC 'ուժեղ համաձայնություն, բայց արգելափակումը, նեղ տեղերը, «պղնձի խողովակները»։
Սագա 'eventium consistency, անհրաժեշտ է փոխհատուցման և հեռուստատեսության կարգապահություն։
Event Sourcing: պահում է իրադարձությունները որպես ճշմարտության աղբյուրը։ սագաները բնական են, բայց ավելացնում են ներարկումների բարդությունը/դիպուկահարները։
15) Անվտանգությունն ու կոմպլենսը
Տրանսպորտի հաջորդականությունը (TFC/mTSA), ACL per topic/queue։
Իրադարձություններում առնվազն PII-ն է, զգայուն դաշտերի ծածկումը, թունայնացումը։
Սագաների և փոխհատուցման ամսագրերի հասանելիության աուդիտ։
SLA-ն արտաքին պրովայդերների հետ (վճարումներ/առաքում) = dedlins և retrav limites պարամետրեր։
16) Chek-Show-( 0-45 օր)
0-10 օր
Ընտրեք թեկնածուներ գործընթացները (բազմապատկիչ, փոխհատուցմամբ)։
Ընտրեք մոդել (նվագարան/խորեոգրաֆիա/TSS) և հարաբերական բանալին։
Նշեք քայլերը/փոխհատուցումը, ինվարանտները և դեդլայնները։ Բարձրացրեք «saga», «www.box», «inbox» աղյուսակները։
11-25 օր
Միացրեք wwww.box/inbox, idempotenty և retray backoff-ից։
Ավելացրեք առաջին սագերը։ ավելացրեք SLI/SLO տախտակները և ճանապարհը։
Գրեք runbook փոխհատուցում (ներառյալ ձեռքով) և շարժասանդուղքներ։
26-45 օր
Ավտոմատիզացրեք GC «կախված» սագը, պարբերական վերագործարկումները/dedline։
Անցկացրեք game-day 'մերժումը, dedline-ը, բրոքերի անհասանելիությունը։
Ստանդարտացրեք իրադարձությունների պայմանագրերը (վարկածներ, համատեղելիություն), ստեղծեք «սագի կատալոգ»։
17) Anti-patterna
«Փոխհատուցում = BD-ից» փոխարենը ուղղակիորեն ճիշտ հակառակը։
Box/inbox-ը չունի իրադարձությունների կորուստ/կրկնակի ազդեցություն։
Retrai առանց ջիթերի ինքնին DDoS կախվածության։
Ակնկալել ուժեղ բանաձև ընթերցանության վրա առանց «վերամշակման»...
Մի հսկա նվագարկիչ ամբողջ ռուսական մոնոլիտի վրա։
Տոտալ խորեոգրաֆիան, առանց տեսողության և SLA-ի, անվերահսկելի պար է։
Դեդլայնների անտեսումը հավիտենական պահուստներ/հոլդներ է։
18) Հասունության մետրերը
Կրիտիկական գործընթացների 90 տոկոսը ծածկված են սագերով/փոխհատուցումներով և ունեն հակաբիոտիկներ։
Medibox/inbox-ը ինտեգրված է Tier-0/1 բոլոր վաճառողների/կոնսուլների համար։
SLO: p95 end-to-end sagi նորմալ, sucess rate կայուն, orphaned <108։
Թափանցիկ ճանապարհը և դաշնամուրները «քայլերով», burn-rate ալերտները։
Եժեքվարթալ game-day-ը և ձեռքով runbook-փոխհատուցման ստուգումը։
19) Եզրակացություն
Սագան գործնական պայմանագիր է բաշխված համակարգերի համար 'հստակ քայլեր և հակառակը, հրատարակման կարգապահությունը (wwww.box/inbox), dedline և retray, դիտարկումը և փոխհատուցման գործընթացները։ Ընտրեք մոդել (նվագախումբ/խորեոգրաֆիա/TSS), տեղադրեք invariants և բանալիներ, մշակողները դարձրեք գաղափարական, և ձեր անիմացիոն բիզնես գործընթացները կդառնան կանխատեսելի և կայուն առանց թանկ 2PC-ի։