REST माइक्रोसर्विसेस में लेनदेन?


195

मान लीजिए कि हमारे पास एक उपयोगकर्ता, वॉलेट रेस्ट माइक्रोसर्विसेज और एक एपीआई गेटवे है जो चीजों को एक साथ जोड़ते हैं। जब बॉब हमारी वेबसाइट पर पंजीकरण करता है, तो हमारे एपीआई गेटवे को उपयोगकर्ता माइक्रोसेवा के माध्यम से एक उपयोगकर्ता बनाने की आवश्यकता होती है और वॉलेट माइक्रो सर्विस के माध्यम से एक वॉलेट।

अब यहां कुछ परिदृश्य हैं जहां चीजें गलत हो सकती हैं:

  • उपयोगकर्ता बॉब निर्माण विफल रहता है: यह ठीक है, हम सिर्फ बॉब को एक त्रुटि संदेश लौटाते हैं। हम एसक्यूएल लेनदेन का उपयोग कर रहे हैं ताकि कोई भी बॉब को सिस्टम में न देखे। सब कुछ अच्छा है :)

  • उपयोगकर्ता बॉब बनाया गया है, लेकिन इससे पहले कि हमारा वॉलेट बनाया जा सके, हमारा एपीआई गेटवे हार्ड क्रैश हो जाता है। अब हमारे पास एक उपयोगकर्ता है जिसमें कोई बटुआ (असंगत डेटा) नहीं है।

  • उपयोगकर्ता बॉब बनाया गया है और जैसा कि हम वॉलेट बना रहे हैं, HTTP कनेक्शन ड्रॉप हो जाता है। बटुआ निर्माण सफल हो सकता है या यह नहीं हो सकता है।

इस तरह की डेटा असंगतता को रोकने के लिए कौन से समाधान उपलब्ध हैं? क्या ऐसे पैटर्न हैं जो लेनदेन को कई REST अनुरोधों को पूरा करने की अनुमति देते हैं? मैंने विकिपीडिया पृष्ठ को दो-चरण प्रतिबद्ध पर पढ़ा है जो इस मुद्दे पर स्पर्श करता है लेकिन मुझे यकीन नहीं है कि इसे व्यवहार में कैसे लागू किया जाए। यह परमाणु वितरित लेनदेन: एक प्रतिष्ठित डिजाइन पेपर भी दिलचस्प लगता है, हालांकि मैंने इसे अभी तक नहीं पढ़ा है।

वैकल्पिक रूप से, मुझे पता है कि REST इस उपयोग के मामले के लिए उपयुक्त नहीं हो सकता है। शायद इस स्थिति को संभालने का सही तरीका है कि REST को पूरी तरह से छोड़ दें और एक संदेश कतार प्रणाली की तरह एक अलग संचार प्रोटोकॉल का उपयोग करें? या क्या मुझे अपने आवेदन कोड में स्थिरता लागू करनी चाहिए (उदाहरण के लिए, एक पृष्ठभूमि नौकरी होने से जो विसंगतियों का पता लगाता है और उन्हें ठीक करता है या "उपयोगकर्ता" पर "स्थिति" बनाने के साथ "बनाने", "बनाया" मान, आदि) के लिए "विशेषता" है?



3
यदि कोई उपयोगकर्ता बिना वॉलेट के कोई मतलब नहीं रखता है, तो इसके लिए एक अलग माइक्रोसेवा क्यों बनाएं? हो सकता है कि पहली जगह में वास्तुकला के साथ कुछ सही नहीं है? आपको सामान्य एपीआई गेटवे, btw की आवश्यकता क्यों है? क्या इसकी कोई खास वजह है?
व्लादिस्लाव रैस्ट्रोसनी

4
@VladislavRastrusny यह एक काल्पनिक उदाहरण था, लेकिन आप उदाहरण के लिए स्ट्राइप द्वारा नियंत्रित की जाने वाली वॉलेट सेवा के बारे में सोच सकते हैं।
ओलिवियर लालोंडे

आप लेन-देन (प्रक्रिया प्रबंधक पैटर्न) को ट्रैक करने के लिए एक प्रक्रिया प्रबंधक का उपयोग कर सकते हैं या प्रत्येक माइक्रोसर्वर को पता है कि रोलबैक (गाथा प्रबंधक पैटर्न) को कैसे ट्रिगर किया जाए या कुछ प्रकार के दो चरण कमिट किए जाएं ( blog.aspiresys.com/software-product-engineering / producteering /… )
andrew pate

@VladislavRastrusny "यदि कोई उपयोगकर्ता बिना वॉलेट के समझ में नहीं आता है, तो इसके लिए एक अलग माइक्रोसेवा क्यों बनाएं" - उदाहरण के लिए, इस तथ्य के अलावा कि कोई उपयोगकर्ता वॉलेट के बिना मौजूद नहीं हो सकता है, उनके पास कोई कोड नहीं है। तो दो टीम स्वतंत्र रूप से उपयोगकर्ता और वॉलेट माइक्रोसिस्टर्स को विकसित और तैनात करने जा रही हैं। क्या यह पहली जगह में माइक्रोसेवा करने की पूरी बात नहीं है?
निक

जवाबों:


148

क्या मतलब नहीं है:

  • अन्य सेवाओं के साथ लेनदेन का वितरण किया । परिभाषा के आधार पर अन्य सेवाएं स्टेटलेस हैं, इसलिए उन्हें एक ट्रांजेक्शनल सीमा में भागीदार नहीं होना चाहिए जो एक से अधिक सेवा प्रदान करता है। आपका उपयोगकर्ता पंजीकरण उपयोग मामला परिदृश्य समझ में आता है, लेकिन उपयोगकर्ता और वॉलेट डेटा बनाने के लिए REST माइक्रोसर्विसेज के साथ डिज़ाइन अच्छा नहीं है।

आपको सिरदर्द क्या देगा:

  • वितरित लेनदेन के साथ EJBs । यह उन चीजों में से एक है जो सिद्धांत में काम करते हैं लेकिन व्यवहार में नहीं। अभी मैं JBoss EAP 6.3 उदाहरणों में दूरस्थ EJBs के लिए एक वितरित लेनदेन कार्य करने का प्रयास कर रहा हूं। हम RedHat समर्थन के लिए हफ्तों से बात कर रहे हैं, और यह अभी तक काम नहीं किया है।
  • सामान्य तौर पर दो-चरण प्रतिबद्ध समाधान । मुझे लगता है कि 2PC प्रोटोकॉल एक महान एल्गोरिथ्म है (कई साल पहले मैंने इसे RPC के साथ C में लागू किया था)। इसके लिए रिट्रीट, स्टेट रिपॉजिटरी आदि के साथ व्यापक फेल रिकवरी मैकेनिज्म की आवश्यकता होती है। सभी जटिलता लेनदेन ढांचे के भीतर छिपी हुई है (उदाहरण: JBoss अर्जुन)। हालांकि, 2PC फेल प्रूफ नहीं है। ऐसी स्थितियां हैं, जिनमें लेन-देन आसानी से पूरा नहीं हो सकता है। फिर आपको मैन्युअल रूप से डेटाबेस की विसंगतियों को पहचानने और ठीक करने की आवश्यकता है। यदि आप भाग्यशाली हैं, तो यह एक लाख लेनदेन में एक बार हो सकता है, लेकिन यह आपके प्लेटफॉर्म और परिदृश्य के आधार पर प्रत्येक 100 लेनदेन में एक बार हो सकता है।
  • सगास (मुआवजा लेनदेन) । मुआवजे के संचालन और अंत में मुआवजे को सक्रिय करने के लिए समन्वय तंत्र बनाने का कार्यान्वयन ओवरहेड है। लेकिन मुआवजा विफल सबूत भी नहीं है। आप अभी भी विसंगतियों (कुछ सिरदर्द) के साथ समाप्त हो सकते हैं।

क्या शायद सबसे अच्छा विकल्प है:

  • आखिरकार संगति । न तो ACID जैसे वितरित लेनदेन और न ही क्षतिपूर्ति लेनदेन विफल प्रमाण हैं, और दोनों से असंगतता हो सकती है। अंततः संगति अक्सर "सामयिक असंगति" से बेहतर होती है। विभिन्न डिजाइन समाधान हैं, जैसे:
    • आप अतुल्यकालिक संचार का उपयोग करके अधिक मजबूत समाधान बना सकते हैं। आपके परिदृश्य में, जब बॉब रजिस्टर करता है, तो एपीआई गेटवे न्यूयूजर कतार में एक संदेश भेज सकता है, और उपयोगकर्ता को यह कहते हुए सही उत्तर दे सकता है कि "आपको खाता बनाने की पुष्टि करने के लिए एक ईमेल प्राप्त होगा।" एक कतार उपभोक्ता सेवा संदेश को संसाधित कर सकती है, एक एकल लेनदेन में डेटाबेस परिवर्तन कर सकती है, और खाता निर्माण को सूचित करने के लिए ईमेल को बॉब को भेज सकती है।
    • उपयोगकर्ता माइक्रोसेवक उसी डेटाबेस में उपयोगकर्ता रिकॉर्ड और वॉलेट रिकॉर्ड बनाता है । इस स्थिति में, उपयोगकर्ता माइक्रो सर्विस में वॉलेट स्टोर केवल वॉलेट ड्रोसवर्क के लिए दिखाई देने वाले मास्टर वॉलेट स्टोर की प्रतिकृति है। एक डेटा सिंक्रोनाइज़ेशन मैकेनिज़्म है जो समय-समय पर ट्रिगर-आधारित या किक्स होता है, जो प्रतिकृति से मास्टर, और इसके विपरीत डेटा परिवर्तन (जैसे, नए वॉलेट) भेजने के लिए होता है।

लेकिन क्या होगा यदि आपको सिंक्रोनस प्रतिक्रियाओं की आवश्यकता है?

  • माइक्रोसेरोल्स को फिर से तैयार करें । यदि कतार के साथ समाधान काम नहीं करता है क्योंकि सेवा उपभोक्ता को तुरंत प्रतिक्रिया की आवश्यकता होती है, तो मैं उपयोगकर्ता और वॉलेट कार्यक्षमता को एक ही सेवा में (या कम से कम एक ही वीएम में वितरित लेनदेन से बचने के लिए) फिर से तैयार करना चाहूंगा। )। हां, यह माइक्रोसेर्विस से एक कदम आगे है और एक मोनोलिथ के करीब है, लेकिन आपको कुछ सिरदर्द से बचाएगा।

4
आखिरकार मेरे लिए काम किया। इस मामले में "न्यूयूजर" कतार उच्च उपलब्ध और लचीला होनी चाहिए।
राम बावड़ीदी

@RamBavireddi क्या काफ्का या रैबिटएमक्यू लचीला लाइनों का समर्थन करते हैं?
v.oddou

@ v.oddou हां, वे करते हैं।
राम बावड़ीड़ी

2
@PaooMerson मुझे इस बात पर यकीन नहीं है कि आप लेन-देन को अंतिम रूप देने के लिए कैसे अलग-अलग हैं। क्या होगा, अगर आपकी अंतिम स्थिरता में, बटुए का निर्माण विफल हो जाता है?

2
@balsick लगातार स्थिरता सेटिंग्स की चुनौतियों में से एक है डिजाइन जटिलता बढ़ जाती है। संगति जाँच और सुधार की घटनाओं की अक्सर आवश्यकता होती है। समाधान का डिज़ाइन भिन्न होता है। उत्तर में, मैं उस स्थिति का सुझाव देता हूं जहां एक संदेश ब्रोकर द्वारा भेजे गए संदेश को संसाधित करते समय डेटाबेस में वॉलेट रिकॉर्ड बनाया जाता है। इस मामले में, हम एक डेड लेटर चैनल सेट कर सकते हैं, अर्थात्, यदि उस संदेश को संसाधित करना एक त्रुटि उत्पन्न करता है, तो हम संदेश को एक मृत पत्र कतार में भेज सकते हैं और "वॉलेट" के लिए जिम्मेदार टीम को सूचित कर सकते हैं।
पाउलो मर्सन

66

यह एक क्लासिक प्रश्न है जो मुझे हाल ही में एक साक्षात्कार के दौरान पूछा गया था कि कैसे कई वेब सेवाओं को कॉल किया जाए और फिर भी कार्य के बीच में किसी प्रकार की त्रुटि से निपटने के लिए संरक्षित करें। आज, उच्च प्रदर्शन कंप्यूटिंग में, हम दो चरण के कमिट्स से बचते हैं। मैंने लेन-देन के लिए "स्टारबक मॉडल" कहा जाने वाला एक पेपर कई साल पहले पढ़ा था: स्टारबक पर आपके द्वारा ऑर्डर किए गए कॉफी का ऑर्डर देने, भुगतान करने, तैयार करने और प्राप्त करने की प्रक्रिया के बारे में सोचें ... मैं चीजों की देखरेख करता हूं लेकिन एक दो चरण वाला मॉडल। सुझाव दें कि पूरी प्रक्रिया में शामिल सभी चरणों के लिए एक एकल रैपिंग लेनदेन होगा जब तक आप अपनी कॉफी प्राप्त नहीं करते। हालांकि, इस मॉडल के साथ, सभी कर्मचारी इंतजार करेंगे और तब तक काम करना बंद कर देंगे जब तक आप अपनी कॉफी प्राप्त नहीं कर लेते। आप तस्वीर देखिए?

इसके बजाय, "सर्वश्रेष्ठ प्रयास" मॉडल का पालन करके और प्रक्रिया में त्रुटियों के लिए क्षतिपूर्ति करके "स्टारबक मॉडल" अधिक उत्पादक है। सबसे पहले, वे सुनिश्चित करते हैं कि आप भुगतान करते हैं! फिर, कप से जुड़े आपके आदेश के साथ संदेश कतारें हैं। यदि प्रक्रिया में कुछ गलत हो जाता है, जैसे कि आपको अपनी कॉफी नहीं मिली, तो यह नहीं है कि आपने क्या आदेश दिया है, आदि, हम मुआवजे की प्रक्रिया में प्रवेश करते हैं और हम यह सुनिश्चित करते हैं कि आप जो चाहते हैं, उसे प्राप्त करें या आपको वापस कर दें, यह सबसे कुशल मॉडल है उत्पादकता में वृद्धि के लिए।

कभी-कभी, स्टारबक एक कॉफी बर्बाद कर रहा है लेकिन समग्र प्रक्रिया कुशल है। जब आप अपनी वेब सेवाओं का निर्माण इस तरह करते हैं, तो उन्हें सोचने के लिए अन्य तरकीबें होती हैं, ताकि उन्हें किसी भी समय कहा जा सके और फिर भी वही अंतिम परिणाम प्रदान कर सकें। तो, मेरी सिफारिश है:

  • अपनी वेब सेवाओं को परिभाषित करते समय बहुत ठीक न हों (मैं इन दिनों हो रही सूक्ष्म-सेवा प्रचार के बारे में आश्वस्त नहीं हूं: बहुत दूर जाने के कई जोखिम);

  • Async प्रदर्शन बढ़ाता है इसलिए async होना पसंद करते हैं, जब भी संभव हो ईमेल द्वारा सूचनाएं भेजें।

  • किसी भी संख्या में उन्हें "वापस लेने योग्य" बनाने के लिए अधिक बुद्धिमान सेवाओं का निर्माण करें, एक यूआईडी या टास्किड के साथ प्रसंस्करण जो अंत तक शीर्ष क्रम का पालन करेगा, प्रत्येक चरण में व्यावसायिक नियमों को मान्य करेगा;

  • संदेश कतारों (JMS या अन्य) का उपयोग करें और उन प्रोसेसर को संभालने में त्रुटि करने के लिए डायवर्ट करें जो विपरीत कार्यों को लागू करके "रोलबैक" पर काम करेंगे, वैसे, async आदेश के साथ काम करने के लिए प्रक्रिया की वर्तमान स्थिति को मान्य करने के लिए किसी प्रकार की कतार की आवश्यकता होगी। तो उस पर विचार करें;

  • अंतिम उपाय में, (क्योंकि यह अक्सर नहीं हो सकता है), इसे त्रुटियों के मैनुअल प्रसंस्करण के लिए एक कतार में रखें।

चलिए पोस्ट की गई प्रारंभिक समस्या के साथ वापस चलते हैं। एक खाता बनाएं और एक वॉलेट बनाएं और सुनिश्चित करें कि सब कुछ किया गया था।

मान लीजिए कि एक वेब सेवा को पूरे ऑपरेशन को ऑर्केस्ट्रेट करने के लिए कहा जाता है।

वेब सेवा का छद्म कोड इस तरह दिखेगा:

  1. खाता सृजन माइक्रोसर्विस को कॉल करें, इसे कुछ जानकारी दें और कुछ अद्वितीय कार्य आईडी 1.1 खाता निर्माण माइक्रोसॉफ़्ट पहले यह जांच करेगा कि क्या वह खाता पहले ही बनाया गया था। एक कार्य आईडी खाते के रिकॉर्ड के साथ जुड़ा हुआ है। Microservice पता लगाता है कि खाता मौजूद नहीं है इसलिए यह इसे बनाता है और कार्य आईडी संग्रहीत करता है। ध्यान दें: इस सेवा को 2000 बार कहा जा सकता है, यह हमेशा एक ही परिणाम करेगा। सेवा एक "रसीद के साथ जवाब देती है जिसमें एक पूर्ववत ऑपरेशन करने के लिए न्यूनतम जानकारी होती है यदि आवश्यक हो"।

  2. वॉलेट निर्माण को कॉल करें, यह खाता आईडी और कार्य आईडी दे रहा है। मान लीजिए कि कोई शर्त मान्य नहीं है और वॉलेट निर्माण नहीं किया जा सकता है। कॉल त्रुटि के साथ देता है लेकिन कुछ भी नहीं बनाया गया था।

  3. ऑर्केस्ट्रेटर को त्रुटि के बारे में बताया जाता है। यह जानता है कि इसे खाता निर्माण को निरस्त करने की आवश्यकता है लेकिन यह स्वयं ऐसा नहीं करेगा। यह चरण 1 के अंत में प्राप्त की गई "न्यूनतम पूर्ववत रसीद" को पारित करके वॉलेट सेवा को करने के लिए कहेगा।

  4. खाता सेवा पूर्ववत रसीद को पढ़ती है और यह जानती है कि ऑपरेशन को कैसे करना है; पूर्ववत रसीद में एक और माइक्रोसर्विस के बारे में जानकारी भी शामिल हो सकती है जिसे वह खुद को नौकरी का हिस्सा बनाने के लिए कह सकता है। इस स्थिति में, पूर्ववत रसीद में खाता आईडी हो सकता है और संभवतः विपरीत ऑपरेशन करने के लिए कुछ अतिरिक्त जानकारी की आवश्यकता होती है। हमारे मामले में, चीजों को सरल बनाने के लिए, मान लें कि खाता अपनी खाता आईडी का उपयोग करके हटा दिया गया है।

  5. अब, मान लें कि वेब सेवा को कभी भी सफलता या विफलता नहीं मिली (इस मामले में) कि खाता निर्माण का पूर्ववत प्रदर्शन किया गया था। यह बस खाते की पूर्ववत सेवा को फिर से कॉल करेगा। और यह सेवा सामान्य नहीं होनी चाहिए क्योंकि इसका लक्ष्य खाते के लिए मौजूद नहीं है। तो यह जाँचता है कि क्या यह मौजूद है और देखता है कि इसे पूर्ववत करने के लिए कुछ नहीं किया जा सकता है। तो यह रिटर्न करता है कि ऑपरेशन एक सफलता है।

  6. वेब सेवा उस उपयोगकर्ता को लौटा देती है जो खाता नहीं बना सका।

यह एक समकालिक उदाहरण है। हम इसे एक अलग तरीके से प्रबंधित कर सकते थे और मामले को हेल्प डेस्क पर लक्षित संदेश कतार में डाल सकते थे यदि हम नहीं चाहते कि सिस्टम पूरी तरह से त्रुटि को ठीक करे "। मैंने देखा है कि यह एक कंपनी में किया जा रहा है जहां पर्याप्त नहीं है। स्थितियों को सही करने के लिए बैक एंड सिस्टम को हुक प्रदान किए जा सकते हैं। हेल्प डेस्क को संदेश प्राप्त हुए जिसमें सफलतापूर्वक प्रदर्शन किया गया था और चीजों को ठीक करने के लिए पर्याप्त जानकारी थी जैसे कि हमारे पूर्ववत रसीद का उपयोग पूरी तरह से स्वचालित तरीके से किया जा सकता है।

मैंने एक खोज की है और Microsoft वेब साइट पर इस दृष्टिकोण के लिए एक पैटर्न विवरण है। इसे क्षतिपूर्ति लेनदेन पैटर्न कहा जाता है:

लेन-देन का पैटर्न


2
क्या आपको लगता है कि आप ओपी को अधिक विशिष्ट सलाह देने के लिए इस उत्तर पर विस्तार कर सकते हैं। जैसा कि यह खड़ा है, यह उत्तर कुछ अस्पष्ट और समझने में कठिन है। हालांकि मैं समझता हूं कि स्टारबक्स में कॉफी कैसे परोसी जाती है, यह मेरे लिए स्पष्ट नहीं है कि इस प्रणाली के किन पहलुओं को REST सेवाओं में अनुकरण किया जाना चाहिए।
jwg

मैंने मूल पोस्ट में शुरू में प्रदान किए गए मामले से संबंधित एक उदाहरण जोड़ा है।
user8098437

2
बस Microsoft द्वारा वर्णित क्षतिपूर्ति लेनदेन पैटर्न के लिए एक लिंक जोड़ा गया।
user8098437

3
मेरे लिए, यह सबसे अच्छा जवाब है। इतना सरल
ऑस्कर नेवरेज

1
ध्यान दें कि कुछ जटिल परिदृश्यों में लेन-देन की क्षतिपूर्ति एकमुश्त असंभव हो सकती है (जैसा कि Microsoft डॉक्स में शानदार ढंग से हाइलाइट किया गया है)। इस उदाहरण में, कल्पना करें कि वॉलेट निर्माण विफल होने से पहले, कोई व्यक्ति खाता सेवा पर GET कॉल करके संबंधित खाते के बारे में विवरण पढ़ सकता है, जो कि खाता निर्माण विफल होने के बाद आदर्श रूप से पहले स्थान पर मौजूद नहीं होना चाहिए। इससे डेटा असंगति हो सकती है। यह अलगाव समस्या SAGAS पैटर्न में अच्छी तरह से जानी जाती है।
अनमोल सिंह जग्गी

32

सभी वितरित प्रणालियों में लेन-देन की निरंतरता के साथ समस्या है। ऐसा करने का सबसे अच्छा तरीका है जैसा आपने कहा, दो-चरणीय प्रतिबद्धता है। एक लंबित स्थिति में वॉलेट और उपयोगकर्ता बनाएं। इसके बनने के बाद, उपयोगकर्ता को सक्रिय करने के लिए एक अलग कॉल करें।

यह अंतिम कॉल सुरक्षित रूप से दोहराने योग्य होना चाहिए (यदि आपका कनेक्शन ड्रॉप हो जाता है)।

यह आवश्यक होगा कि अंतिम कॉल दोनों तालिकाओं के बारे में जानें (ताकि यह एक ही जेडीबीसी लेनदेन में किया जा सके)।

वैकल्पिक रूप से, आप यह सोचना चाहते हैं कि बिना वॉलेट के किसी उपयोगकर्ता के बारे में आप इतने चिंतित क्यों हैं। क्या आप मानते हैं कि इससे समस्या पैदा होगी? यदि ऐसा है, हो सकता है कि अलग रेस्ट कॉल के रूप में उन लोगों को एक बुरा विचार है। यदि कोई उपयोगकर्ता बटुए के बिना मौजूद नहीं होना चाहिए, तो आपको शायद उपयोगकर्ता को बटुआ जोड़ना चाहिए (उपयोगकर्ता को बनाने के लिए मूल POST कॉल में)।


सलाह के लिये धन्यवाद। उपयोगकर्ता / वॉलेट सेवाएं काल्पनिक थीं, बस बिंदु को चित्रित करने के लिए। लेकिन मैं मानता हूं कि जितना संभव हो सके लेनदेन की आवश्यकता से बचने के लिए मुझे सिस्टम को डिजाइन करना चाहिए।
ओलिवियर लालोंडे

7
मैं दूसरे दृष्टिकोण से सहमत हूं। ऐसा लगता है, उपयोगकर्ता को बनाने वाले आपके माइक्रो सर्विस को भी एक वॉलेट बनाना चाहिए, क्योंकि यह ऑपरेशन कार्य की परमाणु इकाई का प्रतिनिधित्व करता है। इसके अलावा, आप इस eapatterns.com/docs/IEEE_Software_Design_2PC.pdf
सत्तार इमामोव

2
यह वास्तव में एक महान विचार है। पूर्ववत एक सिरदर्द हैं। लेकिन एक लंबित स्थिति में कुछ बनाना बहुत कम आक्रामक है। कोई भी जाँच की गई है, लेकिन अभी तक कुछ भी निश्चित नहीं है। अब हमें केवल बनाए गए घटकों को सक्रिय करने की आवश्यकता है। हम शायद गैर-लेन-देन भी कर सकते हैं।
तिमो

10

माइक्रोसर्विस आर्किटेक्चर के प्रमुख पहलुओं में से एक IMHO यह है कि लेन-देन व्यक्तिगत माइक्रो सर्विस (एकल जिम्मेदारी सिद्धांत) तक ही सीमित है।

वर्तमान उदाहरण में, उपयोगकर्ता निर्माण स्वयं लेनदेन होगा। उपयोगकर्ता निर्माण एक USER_CREATED घटना को एक कतार में धकेल देगा। वॉलेट सेवा USER_CREATED ईवेंट की सदस्यता लेगी और वॉलेट निर्माण करेगी।


1
यह मानते हुए कि हम किसी भी और सभी 2PC से बचना चाहते हैं, और यह मानते हुए कि उपयोगकर्ता सेवा डेटाबेस में लिखती है, तब हम संदेश द्वारा उपयोगकर्ता कतार में एक संदेश कतार में धर्मान्तरित होने का दबाव नहीं बना सकते हैं, जिसका अर्थ है कि वह इसे कभी भी नहीं बना सकता है। वॉलेट सेवा।
रोमन खार्कोवस्की

@RomanKharkovski वास्तव में एक महत्वपूर्ण बिंदु। इससे निपटने का एक तरीका लेन-देन शुरू करना, उपयोगकर्ता को बचाना, घटना को प्रकाशित करना (लेन-देन का हिस्सा नहीं) हो सकता है और फिर लेन-देन करना हो सकता है। (सबसे खराब स्थिति, अत्यधिक संभावना नहीं है, प्रतिबद्ध विफल रहता है, और घटना का जवाब देने वाले उपयोगकर्ता को खोजने में असमर्थ होंगे।)
टिमो

1
फिर ईवेंट को डेटाबेस के साथ-साथ इकाई में स्टोर करें। संग्रहीत ईवेंट को संसाधित करने और उन्हें संदेश ब्रोकर को भेजने के लिए एक शेड्यूल किया गया कार्य है। stackoverflow.com/a/52216427/4587961
यान खोंस्की

7

यदि मेरा बटुआ उपयोगकर्ता के रूप में एक ही sql डेटाबेस में रिकॉर्ड का एक और गुच्छा था, तो मैं शायद उपयोगकर्ता और वॉलेट निर्माण कोड को एक ही सेवा में रखूंगा और सामान्य डेटाबेस लेनदेन सुविधाओं का उपयोग करके संभाल सकता हूं।

यह मुझे लगता है कि आप के बारे में पूछ रहे हैं कि क्या होता है जब वॉलेट निर्माण कोड को आपको किसी अन्य सिस्टम या सिस्टम को छूने की आवश्यकता होती है? आईडी का कहना है कि यह सब इस बात पर निर्भर करता है कि निर्माण प्रक्रिया कितनी जटिल और जोखिम भरी है।

यदि यह सिर्फ एक और विश्वसनीय डेटास्टोर (जो आपके sql लेनदेन में भाग नहीं ले सकता है, कहो) को छूने की बात है, तो समग्र सिस्टम मापदंडों के आधार पर, मैं गायब हो जाने वाले छोटे मौके को जोखिम में डालने के लिए तैयार हो सकता हूं कि दूसरा लेखन नहीं होगा। मैं कुछ नहीं कर सकता, लेकिन एक अपवाद को बढ़ाता हूं और एक क्षतिपूर्ति लेनदेन या कुछ एड-हॉक विधि के माध्यम से असंगत डेटा से निपटता हूं। जैसा कि मैं हमेशा अपने डेवलपर्स को बताता हूं: "अगर इस तरह की बात ऐप में हो रही है, तो यह किसी का ध्यान नहीं जाएगा"।

जैसे ही वॉलेट निर्माण की जटिलता और जोखिम बढ़ता है, आपको इसमें शामिल जोखिमों को सुधारने के लिए कदम उठाने चाहिए। मान लीजिए कि कुछ चरणों में कई भागीदार एपिस को कॉल करने की आवश्यकता है।

इस बिंदु पर आप आंशिक रूप से निर्मित उपयोगकर्ताओं और / या जेबों की धारणा के साथ एक संदेश कतार प्रस्तुत कर सकते हैं।

यह सुनिश्चित करने के लिए एक सरल और प्रभावी रणनीति कि आपकी इकाइयाँ अंततः ठीक से निर्मित हो जाती हैं, जब तक वे सफल नहीं हो जाते, तब तक नौकरियों का पुनः प्रयास होता है, लेकिन आपके आवेदन के लिए उपयोग मामलों पर बहुत कुछ निर्भर करता है।

मैं इस बारे में भी लंबे समय तक सोचता रहूंगा कि मेरी प्रोविजनिंग प्रक्रिया में मुझे विफलता क्यों मिली।


4

एक सरल समाधान यह है कि आप उपयोगकर्ता सेवा का उपयोग करके उपयोगकर्ता बना सकते हैं और संदेश सेवा बस का उपयोग करते हैं जहां उपयोगकर्ता सेवा अपने ईवेंट का उत्सर्जन करती है, और संदेश सेवा बस पर वॉलेट सेवा रजिस्टर करती है, उपयोगकर्ता द्वारा बनाई गई घटना को सुनती है और उपयोगकर्ता के लिए वॉलेट बनाती है। इस बीच, यदि उपयोगकर्ता अपने वॉलेट को देखने के लिए वॉलेट यूआई पर जाता है, तो जांचें कि क्या उपयोगकर्ता अभी बनाया गया था और यह दिखाएं कि आपका वॉलेट निर्माण प्रगति पर है, कृपया कुछ समय में देखें


3

इस तरह की डेटा असंगतता को रोकने के लिए कौन से समाधान उपलब्ध हैं?

परंपरागत रूप से, वितरित लेनदेन प्रबंधकों का उपयोग किया जाता है। जावा ईई दुनिया में कुछ साल पहले आपने इन सेवाओं को ईजेबी के रूप में बनाया होगा जो विभिन्न नोड्स में तैनात थे और आपके एपीआई गेटवे ने उन ईजेबी को दूरस्थ कॉल किया होगा। एप्लिकेशन सर्वर (यदि सही तरीके से कॉन्फ़िगर किया गया है) दो चरण प्रतिबद्ध का उपयोग करके स्वचालित रूप से सुनिश्चित करता है, कि लेनदेन या तो प्रतिबद्ध है या प्रत्येक नोड पर वापस आ गया है, ताकि स्थिरता की गारंटी हो। लेकिन इसके लिए आवश्यक है कि सभी सेवाओं को एक ही प्रकार के एप्लिकेशन सर्वर पर तैनात किया जाए (ताकि वे संगत हों) और वास्तव में कभी भी एक ही कंपनी द्वारा तैनात सेवाओं के साथ काम किया जाए।

क्या ऐसे पैटर्न हैं जो लेनदेन को कई REST अनुरोधों को पूरा करने की अनुमति देते हैं?

SOAP (ठीक है, REST नहीं) के लिए, WS-AT विनिर्देशन है, लेकिन मुझे कभी भी एकीकृत करने वाली कोई सेवा का समर्थन नहीं है। REST के लिए, JBoss की पाइपलाइन में कुछ है । अन्यथा, "पैटर्न" या तो एक उत्पाद ढूंढना है जिसे आप अपनी वास्तुकला में प्लग कर सकते हैं, या अपने स्वयं के समाधान का निर्माण कर सकते हैं (अनुशंसित नहीं)।

मैंने जावा ईई के लिए ऐसा उत्पाद प्रकाशित किया है: https://github.com/maxant/genericconnector

आपके द्वारा संदर्भित कागज के अनुसार, एटमिको से ट्राय-कैंसल / कन्फर्म पैटर्न और संबंधित उत्पाद भी है।

BPEL इंजन मुआवजे का उपयोग कर दूर से तैनात सेवाओं के बीच स्थिरता को संभालता है।

वैकल्पिक रूप से, मुझे पता है कि REST इस उपयोग के मामले के लिए उपयुक्त नहीं हो सकता है। शायद इस स्थिति को संभालने का सही तरीका है कि REST को पूरी तरह से छोड़ दें और एक संदेश कतार प्रणाली की तरह एक अलग संचार प्रोटोकॉल का उपयोग करें?

गैर-लेन-देन संसाधनों को "बाध्यकारी" करने के कई तरीके हैं:

  • जैसा कि आप सुझाव देते हैं, आप एक लेन-देन संदेश कतार का उपयोग कर सकते हैं, लेकिन यह अतुल्यकालिक होगा, इसलिए यदि आप प्रतिक्रिया पर निर्भर करते हैं तो यह गड़बड़ हो जाता है।
  • आप इस तथ्य को लिख सकते हैं कि आपको अपने डेटाबेस में बैक एंड सेवाओं को कॉल करने की आवश्यकता है, और फिर एक बैच का उपयोग करके बैक एंड सेवाओं को कॉल करें। फिर से, async, ताकि गड़बड़ हो सकता है।
  • आप एक व्यवसाय प्रक्रिया इंजन का उपयोग अपने एपीआई गेटवे के रूप में बैक एंड माइक्रोसिस्ट्रेट को ऑर्केस्ट्रेट करने के लिए कर सकते हैं।
  • आप दूरस्थ ईजेबी का उपयोग कर सकते हैं, जैसा कि प्रारंभ में उल्लेख किया गया है, क्योंकि यह बॉक्स से बाहर वितरित लेनदेन का समर्थन करता है।

या क्या मुझे अपने आवेदन कोड में स्थिरता लागू करनी चाहिए (उदाहरण के लिए, एक पृष्ठभूमि नौकरी होने से जो विसंगतियों का पता लगाता है और उन्हें ठीक करता है या "उपयोगकर्ता" पर "स्थिति" बनाने के साथ "बनाने", "बनाया" मान, आदि) के लिए "विशेषता" है?

डेविल्स की वकालत करना: ऐसा कुछ क्यों बनाएं, जब ऐसे उत्पाद हों जो आपके लिए (ऊपर देखें) हैं, और संभवत: यह आपसे बेहतर हो सकता है, क्योंकि वे आजमाए जाते हैं और परीक्षण किए जाते हैं।


2

व्यक्तिगत रूप से मुझे माइक्रो सर्विसेज का विचार पसंद है, उपयोग के मामलों से परिभाषित मॉड्यूल, लेकिन जैसा कि आपके प्रश्न का उल्लेख है, वे बैंकों, बीमा, दूरसंचार, आदि जैसे शास्त्रीय व्यवसायों के लिए अनुकूलन समस्याएं हैं ...

वितरित लेनदेन, जैसा कि कई उल्लेख किया गया है, एक अच्छा विकल्प नहीं है, लोग अब अंततः सुसंगत प्रणालियों के लिए अधिक जा रहे हैं, लेकिन मुझे यकीन नहीं है कि यह बैंकों, बीमा, आदि के लिए काम करेगा।

मैंने अपने प्रस्तावित समाधान के बारे में एक ब्लॉग लिखा है, हो सकता है कि यह आपकी मदद कर सकता है ...।

https://mehmetsalgar.wordpress.com/2016/11/05/micro-services-fan-out-transaction-problems-and-solutions-with-spring-bootjboss-and-netflix-eureka/


0

अंततः संगति यहाँ महत्वपूर्ण है।

  • सेवाओं में से एक को घटना का प्राथमिक हैंडलर बनने के लिए चुना जाता है।
  • यह सेवा एकल घटना के साथ मूल घटना को संभालेगी।
  • प्राथमिक हैंडलर अन्य सेवाओं के लिए माध्यमिक प्रभाव को अतुल्यकालिक रूप से संचार करने की जिम्मेदारी लेगा।
  • प्राथमिक हैंडलर अन्य सेवाओं के कॉल का ऑर्केस्ट्रेशन करेगा।

कमांडर वितरित लेनदेन का प्रभारी होता है और नियंत्रण लेता है। यह क्रियान्वित होने के निर्देश को जानता है और उन्हें क्रियान्वित करने का समन्वय करेगा। अधिकांश स्थितियों में सिर्फ दो निर्देश होंगे, लेकिन यह कई निर्देशों को संभाल सकता है।

कमांडर सभी निर्देशों के निष्पादन की गारंटी देने की जिम्मेदारी लेता है, और इसका मतलब है कि रिटायर। जब कमांडर रिमोट अपडेट को प्रभावित करने की कोशिश करता है और उसे कोई प्रतिक्रिया नहीं मिलती है, तो उसके पास कोई प्रयास नहीं होता है। इस तरह प्रणाली को विफलता के लिए कम प्रवण होने के लिए कॉन्फ़िगर किया जा सकता है और यह खुद को ठीक करता है।

जैसा कि हमारे पास है कि हमारे पास सेवानिवृत्तता है। Idempotence दो बार इस तरह से कुछ करने में सक्षम होने की संपत्ति है कि अंतिम परिणाम समान हो जैसे कि यह केवल एक बार किया गया था। हमें दूरस्थ सेवा या डेटा स्रोत पर idempotence की आवश्यकता होती है ताकि, इस मामले में जहां इसे एक से अधिक बार निर्देश प्राप्त हो, यह केवल एक बार प्रक्रिया करता है।

आखिरकार, यह वितरित वितरण चुनौतियों का सबसे हल करता है, हालांकि हमें यहां कुछ बिंदुओं पर विचार करना होगा। प्रत्येक विफल लेनदेन को एक रिट्री द्वारा पीछा किया जाएगा, प्रयास किए गए रिट्रीज़ की मात्रा संदर्भ पर निर्भर करती है।

संगति यानी अंतिम स्थिति है, जबकि प्रणाली एक रिट्री के दौरान सुसंगत स्थिति से बाहर है, उदाहरण के लिए यदि किसी ग्राहक ने एक पुस्तक का आदेश दिया है, और भुगतान किया है और फिर स्टॉक मात्रा को अपडेट करता है। यदि स्टॉक अपडेट संचालन विफल हो जाता है और यह मान लेता है कि अंतिम स्टॉक उपलब्ध था, तब भी पुस्तक तब तक उपलब्ध रहेगी जब तक स्टॉक अपडेट के लिए रिट्री ऑपरेशन सफल नहीं हो जाता। पुनः प्रयास सफल होने के बाद आपका सिस्टम सुसंगत होगा।


-2

API प्रबंधन (APIM) प्लेटफ़ॉर्म का उपयोग क्यों न करें जो स्क्रिप्टिंग / प्रोग्रामिंग का समर्थन करता है? तो, आप सूक्ष्म सेवाओं को परेशान किए बिना APIM में समग्र सेवा का निर्माण करने में सक्षम होंगे। मैंने इस उद्देश्य के लिए APIGEE का उपयोग करके डिज़ाइन किया है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.