საგები და განაწილებული გარიგებები
საგა არის გრძელვადიანი ბიზნეს გარიგება, რომელიც იყოფა ადგილობრივი ნაბიჯების თანმიმდევრობით სხვადასხვა სერვისებში/შენახვის ობიექტებში. თითოეულ ნაბიჯს აქვს კომპენსაციური ეფექტი, რომელიც გადადის ნაბიჯის ეფექტს ნაწილობრივი მარცხით. 2PC/3PC- სგან განსხვავებით, საგები არ ინარჩუნებენ გლობალურ ბლოკირებას და შესაფერისია მიკრო სერვისებისთვის, მულტფილმების რეგიონებისა და მაღალი დატვირთვებისთვის, სადაც დასაშვებია საღამოს კონსულტაცია.
1) როდის უნდა აირჩიოთ საგა (და როდის - არა)
შესაფერისია:- გახანგრძლივებული/მრავალსაფეხურიანი ბიზნეს პროცესები (შეკვეთა - გადახდა - რეზერვი, მიწოდება).
- სხვადასხვა დომენები და საცავები, სადაც არ არის საერთო გარიგება.
- საჭიროა მაღალი წვდომა და ჰორიზონტალური სკალირება.
- მყარი ACID ატომური მოქმედება კრიტიკულია (მაგალითად, დიდი თანხების გადაცემა ერთ რეესტრში).
- არ არსებობს მკაფიო კომპენსაცია (შეუძლებელია „ერთხელ დაცვა“ ან ეფექტის გაუქმება).
- იურიდიული/მარეგულირებელი შეზღუდვები მოითხოვს მკაცრ იზოლაციას და „მყისიერ“ ინვარიანტს.
2) საგნების მოდელები
1. ორკესტრი (Saga Orchestrator): ცენტრალური კოორდინატორი აკონტროლებს ნაბიჯებსა და კომპენსაციას.
დადებითი: აშკარა ნაკადი, შეცდომების კონტროლი, გამარტივებული ტელემეტრია.
უარყოფითი მხარეები: ცენტრალიზაციის წერტილი, „სქელი“ კოორდინატორის რისკი.
2. ქორეოგრაფია: არ არსებობს ცენტრი - ნაბიჯები წამოიწყეს მოვლენებმა („მომსახურება A გაკეთდა X - სერვისი B რეაგირებს“).
დადებითი: სუსტი კავშირი, მარტივი სკალირება.
უარყოფითი მხარეები: უფრო რთულია ნაკადის მონიტორინგი/გაშვება, წესების „ზრდის“ რისკი.
3. TCC (Try-Confirm/Cancel): თითოეული ნაბიჯი არის „სარეზერვო“ (Try), შემდეგ დადასტურება (Confirm) ან გაუქმება (Cancel).
დადებითი: ფსევდო-ორფაზიანი პროტოკოლის უფრო ახლოს, კონტროლირებადი რესურსები.
უარყოფითი მხარეები: უფრო ძვირია ინტერფეისების განხორციელება; მოითხოვს Try- ს მფლობელთა ტაიმაუტს.
3) ნაბიჯის დიზაინი და კომპენსაცია
ინვარიანტები: მკაფიოდ ჩამოაყალიბეთ რა უნდა იყოს ჭეშმარიტი ნაბიჯის „წინ/მის შემდეგ“ (მაგალითად, „დარჩენილი 0“).
ანაზღაურება - საპირისპირო გარიგება: ეს არის ლოგიკური მოქმედება, რომელიც გააუქმებს ბიზნეს ეფექტს (refund, release, restore).
Idempotence: როგორც ნაბიჯი, ისე კომპენსატორი უსაფრთხოდ უნდა განმეორდეს ('operation _ id' მიხედვით).
ტაიმაუტები: თითოეულ ნაბიჯს აქვს deadline; შეფერხება ანაზღაურებას იწყებს.
შეუქცევადი ეფექტები: ჩაწერეთ ისინი ცალკე (შეტყობინებები, ელ.ფოსტა) და დაუშვათ „საუკეთესო ეფორტი“.
4) თანმიმდევრულობა და წესრიგი
Eventual Consistence: მომხმარებლებს შეუძლიათ ნახონ დროის შეუსაბამობები; UX - „მოლოდინით „/სპინერით/სტატუსით.
საკვანძო ბრძანება: გადართვის ნაბიჯები ჯგუფდება ბიზნეს გასაღებით (რიგის _ id) მოვლენების გამარტივების მიზნით.
დედუპლიკაცია: შეინახეთ დამუშავების ჟურნალი ('operation _ id') TTL- ით.
5) ტრანსპორტი და საიმედოობა
Outbox pattern: ღონისძიების ჩაწერა ადგილობრივ Outbox ცხრილში იმავე გარიგების შიგნით, შემდეგ კი ასინქრონული გამოცემა საბურავში.
Inbox/Idempotence store: მომხმარებლის მხარეს არის უკვე დამუშავებული შეტყობინებების ჟურნალი.
Exactly-once ეფექტურია: „Outbox + idempotent consumer“ პრაქტიკულ „ზუსტად ერთხელ“ იძლევა.
DLQ: „შხამიანი“ შეტყობინებებისთვის მდიდარი მეტა-ინფორმაციის და უსაფრთხო რელიეფის საშუალებით.
6) შეცდომების პოლიტიკა, retrai, backoff
ვიმეორებთ მხოლოდ იდემპოტენტურ ნაბიჯებს; ჩაწერის ოპერაციები - 'Idempotency-Key'.
ექსპონენტური backoff + ჯიტერი; საგას მცდელობების შეზღუდვა და მთლიანი ვადა.
სისტემური დეგრადაციის დროს - Circuit Breaker და graceful degradation (მაგალითად, გააუქმეთ საგის მეორეხარისხოვანი ფიკი).
ბიზნეს კონფლიქტები ('409') - განმეორება კოორდინაციის ან ანაზღაურებისა და დასრულების შემდეგ.
7) ორკესტრი: მოვალეობები და სტრუქტურა
ფუნქციები:- საგნების მდგომარეობის თვალყურის დევნება: 'PENDING-RUNNING-COMPENSATING-DONE/FAILED'.
- ნაბიჯების დაგეგმვა, ვადები, ტაიმაუტები, რეკრუტირება.
- მოვლენების როტინგი და კომპენსაციის გაშვება.
- კოორდინატორის ოპერაციების idempotence (გუნდური ჟურნალი).
- დაკვირვება: კორელაცია 'saga _ id' ლოგოებში/ტრეისებში/მეტრიკებში.
- ცხრილები 'saga', 'saga _ step', 'commands', 'outbox'.
- ინდექსები 'saga _ id', 'business _ key', 'status', 'next _ run _ at'.
8) ქორეოგრაფია: წესები და დაცვა „თოვლის კომისგან“
ღონისძიების კონტრაქტები: სქემები და ვერსიები (Avro/Proto/JSON Schema).
მკაფიო სემანტიკა: „ფაქტის მოვლენა“ vs „გუნდი“.
ჯაჭვის ნაშთები: მომსახურება, რომელმაც აღმოაჩინა შეუსაბამობა, აქვეყნებს 'Failed '/' Compensate' მოვლენას.
სიგნალიზაცია და ალერტები „გაუთავებელ მარყუჟებზე“.
9) TCC: პრაქტიკული დეტალები
Try: რესურსის რეზერვი TTL- ით.
Confirm: ფიქსაცია, დროებითი ბლოკირების განთავისუფლება.
კანკელი: სარეზერვო დაბრუნება (გვერდითი მოვლენების გარეშე).
გარბენის კოლექცია: Try ავტომატური გაუქმება TTL- ის შემდეგ (idempotent Cancel).
Idempotent Confirm/Cancel: განმეორება უსაფრთხოა.
10) მაგალითი (სიტყვიერი სქემა) - „შეკვეთა გადახდისა და მიწოდებით“
1. CreateOrder (ადგილობრივად) outbox: 'OrderCreated'.
2. Payrasistvo: რეზერვი 'Try' (TCC); წარმატების მიღწევისას, „Paystress Reserved“, „Paysed Failed“ - ზე უარის თქმის დროს.
3. InventeranService: საქონლის რეზერვი; InventoryFailed- ის ნაკლებობით.
4. ShippingService: მიწოდების სლოტის შექმნა (გაუქმებული).
5. თუ ნებისმიერი ნაბიჯი 'Failed' - ორკესტრი იწყებს კომპენსაციას საპირისპირო თანმიმდევრობით: 'CancelShipping' - 'ReleasInventory' "Paysed Cancel '.
6. თუ ყველა არის „PayseConfirm“ 'OrderConfirmed'.
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', 'step', 'attempt', 'decision' (run/compensate/skip).
მეტრიკა:- წარმატება/საგნების შეცდომა (%), საშუალო ხანგრძლივობა, p95/p99.
- კომპენსირებული საგნების წილი, კომპენსაციის ყველაზე მაღალი მიზეზები.
- რიგები/გარე ლაგი, retrais ნაბიჯებზე.
- ლოგიკური/აუდიტი: ორკესტრის გადაწყვეტილებები, რესურსების იდენტიფიკატორები, ბიზნეს გასაღებები.
13) ტესტირება და ქაოსი
შეცდომების ინექცია ყოველ ნაბიჯზე: ტაიმაუტები, '5xx', ბიზნეს კონფლიქტები.
Out-of-order მოვლენები, დუბლიკატები, გამოტოვება (drop).
ლატენტობის გრძელი კუდები - ვადების შემოწმება და კომპენსაცია.
მასობრივი საგნები - WFQ/DRR და caps შემოწმება რიგებში, „head-of-line ბლოკირების“ არარსებობა.
რედრივი DLQ- დან ნაბიჯებზე და მთელ საგაზე.
14) მულტფილმი-ტენანტობა, რეგიონები, შესაბამისობა
ჭდეები 'tenant _ id/plan/region' ღონისძიებებში და საგნების შენახვაში.
Residence: მონაცემები/მოვლენები არ ტოვებს რეგიონს; ჯვარედინი რეგიონალური საგები შეიმუშავეთ, როგორც ადგილობრივი საგნების + საერთო ღონისძიებების ფედერაციები.
პრიორიტეტიზაცია: VIP საგებს აქვთ უფრო მეტი კვოტის წონა; ვორკერების იზოლაცია per tenant.
15) ჩეკის სია გაყიდვამდე
- თითოეულ ნაბიჯს აქვს მკაფიო კომპენსატორი, ორივე არის იდემპოტენტი.
- შეირჩა შაბლონი: ორკესტრი/ქორეოგრაფია/TSS; აღწერილია პასუხისმგებლობის საზღვრები.
- შემოიღეს Outbox/Inbox, deuplication 'id'.
- Retray პოლიტიკოსები: backoff ერთად jitter, მცდელობების შეზღუდვები და საგნების საერთო ვადა.
- ღონისძიების კონტრაქტები განახლებულია, არსებობს სქემის შესაბამისობა.
- DLQ და უსაფრთხო რადარი მორგებულია.
- ტელემეტრია: მეტრიკა, ტრეისი, კორელაცია 'saga _ id'.
- ოპერაციული playbooks: სახელმძღვანელო cancel/force-confirm, „ჩამოკიდებული“ საგნების დაშლა.
- ქაოსისა და დატვირთვის ტესტები გადის, SLO/შეცდომების ბიუჯეტი განისაზღვრება.
16) ტიპიური შეცდომები
არ არსებობს კომპენსატორი ან ის არის „უწმინდური“ (აქვს გვერდითი მოვლენები).
არ არსებობს idempotence/dedup - დუბლები და სახელმწიფოების „საქანელები“.
„საგა საგაში“ აშკარა საზღვრების გარეშე - ციკლები და ურთიერთგამომრიცხავი ბლოკები.
არ არსებობს ვადები - „მარადიული“ საგნები და რესურსების გაჟონვა.
ორკესტრი ინახავს მდგომარეობას „მეხსიერებაში“ მდგრადი ნაკადის გარეშე.
ქორეოგრაფია ტელემეტრიული ცენტრის გარეშე არის „უხილავი“ წარუმატებლობები.
გაუმჭვირვალე UX: მომხმარებლები ვერ ხედავენ შუალედურ სტატუსებს.
17) სწრაფი რეცეპტები
კლასიკური SaaS: ორკესტრი + outbox/inbox, ექსპონენციალური backoff, DLQ, საგა სტატუსები UI- ში.
ძლიერი რესურსის ინვარიანტები: TCC TTL რეზერვით და GC Cancel.
მაღალი მოცულობა/დატვირთვა: მოვლენების ქორეოგრაფია + მკაცრი იდემპოტენტობა და მეტრიკა გასაღებით.
მულტფილმის რეგიონი: ადგილობრივი საგები + საბოლოო დანაყოფები; თავიდან აიცილოთ გლობალური დაბლოკვა.
დასკვნა
საგა არის გზა, რომ მიიღოთ პროგნოზირებადი კოორდინაცია განაწილებულ სისტემებში გლობალური ბლოკირების გარეშე. მკაფიო კომპენსატორები, idempotence, საიმედო მიწოდება (outbox/inbox), ტაიმუთისა და რეპრესიების დისციპლინა, პლუს ტელემეტრია და ფლეიბუკი - გასაღები, რომ რთული ბიზნეს პროცესები დარჩეს სტაბილური და წაკითხული დატვირთვის გაზრდის დროს, მომსახურების რაოდენობა და გეოგრაფია.