सागा पैटर्न और वितरित लेनदेन
सागा पैटर्न और वितरित लेनदेन
1) सागा की आवश्यकता क्यों है
क्लासिक 2PC (दो-चरण की लैचिंग) खराब स्केलेबल है, विफलताओं और ब्लॉक संसाधनों के तहत जटिल है। गाथा समग्र व्यवसाय प्रक्रिया को स्थानीय लेनदेन (चरणों) के अनुक्रम में तोड़ ती है, जिनमें से प्रत्येक स्वतंत्र रूप से प्रतिबद्ध है। विफलता के मामले में, बाद के चरणों को रद्द कर दिया जाता है, और जो पहले ही पूरा हो चुके हैं, उन्हें रिवर्स ऑपरेशन द्वारा मुआवजा दिया जाता है।
परिणाम: वैश्विक अवरोधन, उच्च उत्तरजीविता और एक स्पष्ट पुनर्प्राप्ति प्रोटोकॉल के बिना अंतिम स्थिर
2) बुनियादी मॉडल
2. 1 ऑर्केस्ट्रेशन
एक समर्पित गाथा समन्वयक चरणों का प्रबंधन करता है: कमांड भेजता है, प्रतिक्रियाओं/घटनाओं का इंतजार करता है, मुआवजे की शुरुआत करता है।
पेशेवरों: केंद्रीकृत नियंत्रण, सरल अवलोकन, स्पष्ट समय सीमा। विपक्ष: वैकल्पिक घटक।
2. 2 कोरियोग्राफी
कोई समन्वयक नहीं; सेवाएं एक-दूसरे की घटनाओं का जवाब देती हैं ("ऑर्डर्ड प्लेस्टेड" " कैप्चर्ड" "InventoryReservered"...)।
पेशेवरों: कमजोर कनेक्टिविटी। विपक्ष: स्पष्ट नियमों के बिना "मृत्यु के नृत्य" का पता लगाने के लिए कठिन।
2. 3 टीसीसी (कोशिश करें पुष्टि/रद्द करें)
"ठंड" संसाधनों के साथ विकल्प:1. कोशिश करें - तैयारी/आरक्षित,
2. पुष्टि - निर्धारण,
3. रद्द करें - रोलबैक।
गारंटी अधिक है, लेकिन अनुबंध और आरक्षित समय अधिक जटिल हैं।
3) चरण और मुआवजा अनुबंध
प्रत्येक चरण = स्थानीय लेनदेन + मुआवजा (पहचान, पुनरावृत्ति की अनुमति देता है)।
पूरी तरह से "दुनिया को वापस करने" के लिए मुआवजे की आवश्यकता नहीं है - डोमेन समकक्ष पर्याप्त है (उदाहरण के लिए, "भुगतान हटाने" के बजाय "वापसी भुगतान")।
अपरिवर्तनों को परिभाषित करें: पैसे के लिए - शेष माइनस में नहीं जाता है; आदेशों के लिए - कोई "त्रिशंकु" स्थिति नहीं
अतिदेय प्रयासों के लिए समय सीमा/टीटीएल भंडार और एक "कचरा संग्राहक" दर्ज करें।
4) स्थिरता और वितरण शब्दार्थ
संदेश वितरण: कम से कम एक बार (डिफ़ॉल्ट) - सभी ऑपरेशन पहचाने जाने चाहिए।
क्रम: सहसंबंध कुंजी द्वारा महत्वपूर्ण (उदा। 'ऑर्डर _ आईडी', 'प्लेयर _ आईडी')।
वास्तव में-एक बार गाथा का लक्ष्य नहीं है; हम निष्पक्ष कुंजी, आउटबॉक्स/इनबॉक्स और सही कमिटिंग के माध्यम से प्रभावी एकरूपता हासिल करते हैं।
5) गाथा की स्थिति और उसका लॉग
क्या संग्रहीत करें:- 'saga _ id', 'सहसंबंध _ id', वर्तमान स्थिति (रनिंग/पूर्ण/मुआवजा/मुआवजा/विफल),
- चरण और इसके चर (भुगतान/आरक्षित आईडी),
- घटनाओं/निर्णयों का इतिहास (लॉग), टाइमस्टैम्प, समय सीमा, रिट्रे की संख्या।
- समन्वयक को उपलब्ध एक अलग सागा स्टोर (तालिका/दस्तावेज़)।
- कोरियोग्राफी के लिए - गाथा के स्थानीय "एजेंट", एक सामान्य विषय में स्थिति घटनाओं को प्रकाशित करना।
6) विश्वसनीय प्रकाशन पैटर्न: आउटबॉक्स/इनबॉक्स
आउटबॉक्स: चरण परिवर्तन करता है और एक लेनदेन में आउटबॉक्स तालिका में घटना/कमांड लिखता है; कार्यकर्ता टायर में प्रकाशित होता है।
इनबॉक्स: उपभोक्ता संसाधित 'संदेश _ id' → dedup + idempotency की एक तालिका रखता है।
एक सफल साइड इफेक्ट के बाद ऑफसेट/एसीके (काफ्का/रैबिटएमक्यू) - पहले नहीं।
7) गाथा चरणों को डिजाइन करना
7. 1 उदाहरण (आईगेमिंग/ई-कॉमर्स खरीद)
1. स्थान आदेश → स्थिति 'पेंडिंग'।
2. आधिकारिकभुगतान (कोशिश) → 'भुगतान _ होल्ड _ आईडी'।
3. इन्वेंटरी 'आरक्षण _ id'।
4. CapsurePument (पुष्टि)।
5. फाइनल ऑर्डर → 'पूरा'।
मुआवजे:- यदि (3) 'कैंसिलहोल्ड' - विफल हो जाता है;
- (4) (3) → 'रिलेशनइन्वेंटरी' के बाद विफल;
- यदि (5) 'रिफंडपेमेंट' और 'रिलेशनइन्वेंटरी' - विफल रहता है।
7. 2 डेडलाइन/रिट्रीट्स
घातीय विलंब + jitter के साथ अधिकतम N पुनः प्राप्त करता है।
अधिक होने के बाद - 'क्षतिपूर्ति' पर जाएं।
प्रत्येक चरण के लिए next_attempt_at और deadline_at स्टोर करें।
8) ऑर्केस्ट्रेटर बनाम मंच
विकल्प:- लाइटवेट होम ऑर्केस्ट्रेटर (माइक्रोसर्विस + सागा टेबल)।
- प्लेटफ़ॉर्म: टेम्पोरल/ताल, कैमुंडा, नेटफ्लिक्स कंडक्टर, ज़ीबे - टाइमर, रिट्रे, लंबे समय तक रहने वाले वर्कफ़्लो, दृश्यता और एक वेब कंसोल देते हैं।
- कोरियोग्राफी के लिए, एक घटना कैटलॉग और एक सख्त स्थिति/कुंजी सम्मेलन का उपयोग करें।
9) एकीकरण प्रोटोकॉल
9. 1 अतुल्यकालिक (काफ्का/रैबिटएमक्यू)
कमांड: 'भुगतान। प्राधिकृत करें v1 ',' इन्वेंट्री। आरक्षित। v1 '।
घटनाएँ: 'भुगतान। अधिकृत। v1 ',' इन्वेंट्री। आरक्षित। v1 ',' भुगतान। कब्जा कर लिया v1 ',' भुगतान। वापस लौटा दिया। v1 '।
भाग कुंजी = 'क्रम _ id '/' player _ id' क्रम के लिए।
9. 2 तुल्यकालिक (HTTP/gRPC) एक चरण के भीतर
"लघु" चरणों के लिए मान्य, लेकिन हमेशा टाइमआउट/रिट्रे/आइडेम्पोटेंसी के साथ और अतुल्यकालिक मुआवजे के लिए फॉलबैक।
10) पहचान और चाबियाँ
कमांड और मुआवजे के अनुरोधों में, 'idempotency _ key' पास करें।
साइड इफेक्ट्स (डेटाबेस/राइटिंग ऑफ पर लिखना) सशर्त रूप से किया जाता है: "यदि आपने अभी तक 'idempotency _ key' नहीं देखा है तो प्रदर्शन करें।"
मुआवजा भी सही है: 'रिफंडपेमेंट (id = X)' को दोहराना सुरक्षित है।
11) त्रुटि से निपटने
कक्षाएं:- क्षणिक (नेटवर्क/टाइमआउट) → रिट्रे/बैकऑफ।
- व्यवसाय (अपर्याप्त निधि, सीमा) → तत्काल मुआवजा/वैकल्पिक पथ।
- अपरिवर्तनीय - मैनुअल हस्तक्षेप, मैनुअल मुआवजा।
- एक समाधान मैट्रिक्स बनाएँ: त्रुटि प्रकार → क्रिया (retry/conferate/scescate)।
12) अवलोकन और एसएलओ साग
SLI/SLO:- गाथा की एंड-टू-एंड लेटेंसी (p50/p95/p99)।
- सफलता की दर।
- क्षतिपूर्ति करने के लिए औसत समय - क्षतिपूर्ति दर।
- जीसी के लिए अनाथ सागा और समय।
- ट्रेस: '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(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 और ईएस के साथ तुलना
2PC: मजबूत स्थिरता, लेकिन रुकावटें, अड़ चनें, तांबे के पाइप।
सागा: अंतिम स्थिरता, आपको मुआवजे और टेलीमेट्री के अनुशासन की आवश्यकता है।
इवेंट सोर्सिंग: घटनाओं को सच्चाई के स्रोत के रूप में संग्रहीत करता है; इस पर सागा प्राकृतिक हैं, लेकिन प्रवास/स्नैपशॉट में जटिलता जोड़ें।
15) सुरक्षा और अनुपालन
परिवहन सुरक्षा (टीएलएस/एमटीएलएस), एसीएल प्रति विषय/कतार।
घटनाओं में - कम से कम पीआईआई, संवेदनशील क्षेत्रों का एन्क्रिप्शन, टोकन।
सागा और मुआवजा लॉग तक पहुंच।
बाहरी प्रदाताओं (भुगतान/वितरण) = समय सीमा और रिट्रे सीमा मापदंडों के साथ एसएलए।
16) कार्यान्वयन चेकलिस्ट (0-45 दिन)
0-10 दिन
उम्मीदवार प्रक्रियाओं (बहु-सेवा, क्षतिपूर्ति) का चयन करें।
मॉडल (ऑर्केस्ट्रेशन/कोरियोग्राफी/टीसीसी) और सहसंबंध कुंजी चुनें।
कदम/ऑफसेट, अपरिवर्तनीय और समय सीमा का वर्णन करें। टेबल 'गाथा', 'आउटबॉक्स', 'इनबॉक्स' उठाएँ.
11-25 दिन
आउटबॉक्स/इनबॉक्स, आइडेम्पोटेंसी और बैकऑफ रिट्रेसेस शामिल करें।
Deploite पहले sagas; SLI/SLO डैशबोर्ड और ट्रेस जोड़ें।
मुआवजे (मैनुअल सहित) और वृद्धि की एक रनबुक लिखें।
26-45 दिन
समय सीमा पर स्वचालित जीसी "हैंगिंग" सागा, आवधिक पुनरारंभ/निरंतरता।
खेल-दिवस बिताएं: चरण विफलता, समय सीमा अधिक, दलाल अनुपलब्धता।
घटना अनुबंध (संस्करण, संगतता) को मानकीकृत करें, एक "गाथा निर्देशिका" सेट करें।
17) एंटी-पैटर्न
डोमेन-सही रिवर्स एक्शन के बजाय "मुआवजा = डेटाबेस से हटाएं"।
कोई आउटबॉक्स/इनबॉक्स → घटनाओं/दोहरे प्रभाव का नुकसान नहीं।
जिटर के बिना Retrai → आत्म-DDoS निर्भरता।
"प्रगति में प्रसंस्करण" के बिना पढ़ ने पर मजबूत स्थिरता की उम्मीद करना
सभी के लिए एक विशाल ऑर्केस्ट्रेटर नियंत्रण मोनोलिथ।
दृश्यता और SLA के बिना कुल कोरियोग्राफी → बेकाबू नृत्य।
समय सीमा की अनदेखी - अनन्त भंडार/होल्ड।
18) परिपक्वता मैट्रिक्स
≥ 90% महत्वपूर्ण प्रक्रियाएं सागा/मुआवजे द्वारा कवर की जाती हैं और वर्णित अपरिवर्तनीय हैं।
आउटबॉक्स/इनबॉक्स सभी Tier-0/1 उत्पादकों/उपभोक्ताओं के लिए एकीकृत हैं।
SLO: p95 एंड-टू-एंड गाथा सामान्य है, सफलता दर स्थिर है, अनाथ <लक्ष्य है।
पारदर्शी ट्रेसिंग और डैशबोर्ड "चरणों में", बर्न-रेट अलर्ट।
त्रैमासिक खेल-दिवस और मैनुअल रनबुक मुआवजा जांच।
19) निष्कर्ष
सागा वितरित प्रणालियों के लिए सुसंगतता का एक व्यावहारिक अनुबंध है: स्पष्ट कदम और रिवर्स एक्शन, प्रकाशन अनुशासन (आउटबॉक्स/इनबॉक्स), समय सीमा और रिट्रेज़, अवलोकन और मुआवजा प्रक्रियाएं। एक मॉडल (ऑर्केस्ट्रेशन/कोरियोग्राफी/टीएसएस) चुनें, आक्रमणकारियों और चाबियों को ठीक करें, हैंडलर को पहचानने वाला बनाएं - और आपकी मल्टीसर्विस व्यवसाय प्रक्रियाएं महंगी 2PC के बिना अनुमानित और स्थिर हो जाएंगी।