सागास और वितरित लेनदेन
एक गाथा एक दीर्घकालिक व्यावसायिक लेनदेन है जो विभिन्न सेवाओं/भंडारों में स्थानीय चरणों के अनुक्रम में टूट गया है। प्रत्येक चरण में एक क्षतिपूर्ति कार्रवाई होती है जो आंशिक विफलता में चरण प्रभाव को वापस रोल करती है। 2PC/3PC के विपरीत, सागा वैश्विक ताले नहीं रखते हैं और माइक्रोसर्विस, बहु-क्षेत्रों और उच्च भार के लिए उपयुक्त हैं, जहां अंततः स्थिरता स्वीकार्य है।
1) सागा कब चुनें (और जब नहीं)
फिट:- लंबी/बहु-चरण व्यवसाय प्रक्रियाएं (ऑर्डर → भुगतान → आरक्षित → वितरण)।
- विभिन्न डोमेन और भंडार जहां कोई सामान्य लेनदेन नहीं है।
- उच्च उपलब्धता और स्केल-आउट की आवश्यकता है।
- ठोस ACID परमाणुता महत्वपूर्ण है (उदाहरण के लिए, एक ही रजिस्ट्री के भीतर बड़ी मात्रा में स्थानांतरित करना)।
- कोई स्पष्ट मुआवजा नहीं है (आप "आरक्षित" या प्रभाव रद्द नहीं कर सकते हैं)।
- कानूनी/नियामक प्रतिबंधों के लिए सख्त अलगाव और "त्वरित" अपरिवर्तनीय की आवश्यकता होती है।
2) सगास मॉडल
1. सागा ऑर्केस्ट्रेटर-केंद्रीय समन्वयक चरणों और मुआवजे का प्रबंधन करता है।
पेशेवरों: स्पष्ट प्रवाह, त्रुटि नियंत्रण, सरलीकृत टेलीमेट्री।
विपक्ष: केंद्रीकरण बिंदु, "वसा" समन्वयक का जोखिम।
2. कोरियोग्राफी (कोरियोग्राफी): कोई केंद्र - चरण घटनाओं द्वारा शुरू नहीं किए जाते हैं ("सेवा ए ने एक्स → सेवा बी प्रतिक्रियाएं")।
पेशेवरों: कमजोर कनेक्टिविटी, सरल स्केलिंग।
विपक्ष: प्रवाह को ट्रैक करना/डिबग करना अधिक कठिन है, नियमों के "फैलाव" का जोखिम।
3. टीसीसी (कोशिश-पुष्टि/रद्द) - प्रत्येक चरण "कोशिश करें" है, फिर पुष्टि करें या रद्द करें।
पेशेवरों: छद्म-दो-चरण प्रोटोकॉल के करीब, प्रबंधित संसाधन।
विपक्ष: इंटरफेस के कार्यान्वयन में अधिक महंगा; "कोशिश करो" धारक समय की आवश्यकता है।
3) पिच और मुआवजा डिजाइन
Invariants: स्पष्ट रूप से बताएं कि कदम से पहले/बाद में क्या सच होना चाहिए (उदाहरण के लिए, "शेष ≥ 0")।
मुआवजा - रिवर्स लेनदेन: यह एक तार्किक कार्रवाई है जो व्यावसायिक प्रभाव (वापसी, रिलीज, बहाल) को रद्द करती है।
पहचान: दोनों चरण और क्षतिपूरक को सुरक्षित रूप से दोहराया जाना चाहिए ('ऑपरेशन _ आईडी' द्वारा)।
टाइमआउट: प्रत्येक चरण की समय सीमा होती है; देरी मुआवजे को ट्रिगर करती है।
गैर-वापसी प्रभाव: उन्हें अलग से रिकॉर्ड करें (सूचनाएं, ई-मेल) और "सर्वश्रेष्ठ प्रयास" की अनुमति दें।
4) स्थिरता और व्यवस्था
अंतिम स्थिरता: उपयोगकर्ता समय विसंगतियों को देख सकते हैं; UX - "प्रतीक्षा करें "/स्पिनर/स्टेटस के साथ।
कुंजी द्वारा आदेश - घटनाओं को ऑर्डर करने के लिए व्यापार कुंजी (order_id) द्वारा स्विचिंग चरण समूह।
Deduplication - TTL के साथ प्रोसेसिंग लॉग ('ऑपरेशन _ id' स्थिति) को संग्रहीत करें।
5) परिवहन और विश्वसनीयता
आउटबॉक्स पैटर्न-एक ही लेनदेन के भीतर स्थानीय आउटबॉक्स टेबल पर घटना लिखता है, और फिर अतुल्यकालिक रूप से इसे बस में प्रकाशित करता है।
इनबॉक्स/आइडेम्पोटेंसी स्टोर: उपभोक्ता पक्ष पर - पहले से संसाधित संदेशों का एक लॉग।
वास्तव में एक बार प्रभावी ढंग से: "आउटबॉक्स + आइडेम्पोटेंट उपभोक्ता" एक व्यावहारिक "बिल्कुल एक बार" दे
DLQ: अमीर मेटा-सूचना और सुरक्षित रेड्राइव के साथ "जहरीले" संदेशों के लिए।
6) त्रुटि, रिट्रे, बैकऑफ नीतियां
हम केवल पहचान के कदमों को दोहराते हैं; संचालन लिखें - 'Idempotency-Key' के साथ।
घातीय बैकऑफ + जिटर; गाथा के प्रयासों और सारांश समय सीमा को सीमित करना।
प्रणालीगत गिरावट के साथ - सर्किट ब्रेकर और सुंदर गिरावट (उदाहरण के लिए, गाथा के द्वितीयक कथा भाग को रद्द करें)।
व्यावसायिक संघर्ष ('409') - सुलह या क्षतिपूर्ति और अंत के बाद फिर से प्रयास करें।
7) ऑर्केस्ट्रेटर: जिम्मेदारियां और संरचना
फंक्शन्स:- गाथा की स्थिति पर नज़र रखना: 'पेंडिंग रनिंग क्षतिपूर्ति/असफल'।
- योजना के कदम, समय सीमा, समय-सीमा, पीछे हटना।
- इवेंट रूटिंग और क्षतिपूर्ति लॉन्च।
- समन्वयक संचालन की पहचान (कमांड लॉग)।
- अवलोकन: लॉग/ट्रेस/मेट्रिक्स में 'saga _ id' सहसंबंध।
- टेबल्स 'गाथा', 'saga _ step', 'commands', 'outbox'.
- 'saga _ id', 'business _ key', 'state', 'next _ run _ at' पर इंडेक्स।
8) कोरियोग्राफी: "स्नोबॉल" के खिलाफ नियम और सुरक्षा
घटना अनुबंध: योजनाएं और संस्करण (एवरो/प्रोटो/JSON स्कीमा)।
स्पष्ट शब्दार्थ: "घटना तथ्य" बनाम "कमांड"।
श्रृंखला को रोकना: सेवा, एक बेमेल का पता लगाने के बाद, एक 'असफल '/' मुआवजा' घटना प्रकाशित करती है।
"अंतहीन छोरों" पर अलार्म और अलर्ट।
9) टीसीसी: व्यावहारिक विवरण
कोशिश करें: टीटीएल के साथ संसाधन आरक्षित।
पुष्टि करें: प्रतिबद्ध, अस्थायी ताले जारी करें।
रद्द करें: आरक्षित रोलबैक (साइड इफेक्ट्स के बिना)।
कचरा संग्रह: टीटीएल (पहचान रद्द) के बाद कोशिश का स्वचालित रद्द करना।
पुष्टि करें/निष्क्रिय करें: दोहराना सुरक्षित है.
10) उदाहरण (शब्द योजना) - "भुगतान और वितरण के साथ आदेश"
1. क्रीट ऑर्डर (स्थानीय) → आउटबॉक्स: 'ऑर्डनिर्मित'।
2. Service: 'ट्राई' रिजर्व (TCC); यदि ' Reservented' succeds, यदि ' Factive' विफल हो जाता है।
3. InventoryService: उत्पाद आरक्षित → 'InventoryFacted' से बाहर।
4. Sh Service - डिलीवरी स्लॉट बनाएँ (रद्द करने योग्य)।
5. यदि कोई 'असफल' कदम है - ऑर्केस्ट्रेटर रिवर्स ऑर्डर में क्षतिपूर्ति शुरू करता है: 'रद्द करना' 'ReleaseInventory' 'ConferCancel'।
6. यदि सब ठीक है → 'पुष्टि करें' → 'आदेश की पुष्टि'।
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) अवलोकन और परिचालन एसएलओ
ट्रेसिंग: एकल 'saga _ id', एनोटेशन 'स्टेप', 'प्रयास', 'निर्णय' (रन/क्षतिपूर्ति/स्किप)।
मेट्रिक्स:- सागा की सफलता/त्रुटि (%), औसत अवधि, p95/p99।
- मुआवजे का हिस्सा, मुआवजे के शीर्ष कारण।
- कतारें/आउटबॉक्स लैग्स, चरणों में रिट्रेज़।
- लॉग/ऑडिट: ऑर्केस्ट्रेटर समाधान, संसाधन पहचानकर्ता, व्यवसाय कुंजी।
13) परीक्षण और अराजकता
प्रत्येक चरण में त्रुटियों को इंजेक्ट करना: टाइमआउट, '5xx', व्यापार संघर्ष।
आउट-ऑफ-ऑर्डर इवेंट्स, डुप्लिकेट, ड्रॉप्स।
विलंबता की लंबी पूंछ - समय सीमा और मुआवजे की जाँच।
मास सागास - WFQ/DRR की जाँच और कतारों में कैप, "हेड-ऑफ-लाइन ब्लॉकिंग" की अनुपस्थिति।
कदम में और एक पूरी गाथा में DLQ से Redrave।
14) बहु-किरायेदारी, क्षेत्र, अनुपालन
टैग 'किरायेदार _ आईडी/प्लान/क्षेत्र' इन घटनाओं और गाथा भंडार।
रेजीडेंसी: डेटा/घटनाएं क्षेत्र को नहीं छोड़ ती हैं; क्रॉस-रीजनल सागा को स्थानीय सागा + एग्रीगेटिंग इवेंट्स के फेडरेशन के रूप में डिज़ाइन किया गया
प्राथमिकता: वीआईपी सागा अधिक कोटा वजन ले जाते हैं; प्रति किरायेदार श्रमिकों का अलगाव।
15) प्री-सेल चेकलिस्ट
- प्रत्येक चरण में एक स्पष्ट प्रतिपूरक होता है, दोनों पहचाने जाते हैं।
- साँचा चयनित: ऑर्केस्ट्रेशन/कोरियोग्राफी/टीएसएस; उत्तरदायित्व सीमाओं का वर्णन किया गया है।
- आउटबॉक्स/इनबॉक्स कार्यान्वित, 'ऑपरेशन _ आईडी' द्वारा डीडुप्लिकेशन।
- रिट्रे नीतियां: जिटर के साथ बैकऑफ, सीमा आज़माएं और समग्र गाथा की समय सीमा।
- घटना अनुबंध सत्यापित हैं, योजना की मान्यता है।
- DLQ और सुरक्षित रिलीज़ कॉन्फ़िगर किए गए हैं।
- टेलीमेट्री: मेट्रिक्स, ट्रेसिंग, सहसंबंध 'गाथा _ आईडी'।
- ऑपरेशनल प्लेबुक: मैनुअल रद्द/बल-पुष्टि, "त्रिशंकु" सागा को अनलॉक करना।
- अराजकता और लोड परीक्षण पास, SLO/त्रुटि बजट परिभाषित।
16) विशिष्ट त्रुटियाँ
कोई मुआवजा नहीं है या यह "अशुद्ध" है (इसके दुष्प्रभाव हैं)।
राज्यों की कोई पहचान/डिडअप - डबल्स और "स्विंग्स" नहीं है।
स्पष्ट सीमाओं के बिना "सागा में सागा" - चक्र और आपसी ताले।
कोई समय सीमा नहीं है - "शाश्वत" साग और संसाधन लीक।
ऑर्केस्ट्रेटर एक स्थिर स्टोर के बिना राज्य को "स्मृति में" संग्र
टेलीमेट्री सेंटर के बिना कोरियोग्राफी - "अदृश्य" विफलताएं।
अपारदर्शी UX: उपयोगकर्ता मध्यवर्ती स्थिति नहीं देखते हैं।
17) त्वरित व्यंजनों
SaaS क्लासिक्स: ऑर्केस्ट्रेशन + आउटबॉक्स/इनबॉक्स, घातीय बैकऑफ, DLQ, गाथा स्टेटस UI में।
मजबूत संसाधन अपरिवर्तनीय: टीसीसी रिजर्व टीटीएल और जीसी रद्द के साथ।
उच्च मात्रा/भार: घटना कोरियोग्राफी + सख्त पहचान और कुंजी मैट्रिक्स।
बहु-क्षेत्र: स्थानीय सागा + अंतिम समुच्चय; वैश्विक ताले से बचें।
निष्कर्ष
सागा वैश्विक ताले के बिना वितरित प्रणालियों में पूर्वानुमानित स्थिरता प्राप्त करने का एक स्पष्ट क्षतिपूरक, निष्क्रियता, विश्वसनीय वितरण (आउटबॉक्स/इनबॉक्स), टाइमआउट और रिट्रे अनुशासन, प्लस टेलीमेट्री और प्लेबुक यह सुनिश्चित करने की कुंजी है कि जटिल व्यावसायिक प्रक्रियाएं स्रिय रहें।