यदि आप अपने सॉफ़्टवेयर को डिज़ाइन करते हैं जो कई माइक्रोसेवा को अपडेट करता है, अगर उनमें से एक विफल रहता है?


12

क्या कोई डिज़ाइन पैटर्न या अभ्यास है जिसका उपयोग मैं उन सेवाओं की मदद कर सकता हूं जो या तो नीचे हैं या नीचे जा रही हैं, जबकि अन्य स्थिर हैं?

क्या होगा अगर मेरे पास तीन माइक्रोसर्विस हैं, और उनमें से दो अच्छे हैं, और एक POST के बीच में ही मर जाता है? दो POST मिलेगा और एक नहीं होगा। मुझे नहीं लगता कि मैं लेनदेन कर सकता हूं क्योंकि मैं एक सेवा के लिए अपने अनुरोधों को शिपिंग कर रहा हूं।

मैं उसके लिए कैसे डिजाइन करूं? मुझे विभिन्न डेटाबेस में अनाथ डेटा नहीं चाहिए।


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

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

"कतार प्रबंधक" जैसी किसी चीज़ का उपयोग नहीं करना चाहिए, जो मुझे लगता है कि रेडिस एक अड़चन का कारण होगा? या कम से कम उच्च क्षमता भी है? मुझे आपके द्वारा वर्णित किसी भी अन्य तरीके के बारे में नहीं पता है।
जॉनी

डेटा प्रवाह की मात्रा के आधार पर, मैंने एक कतार प्रबंधक को लागू किया है, जो सफलता की सूचना देने तक प्रसारण को पुन: चलाता है या यह एक विफल अधिसूचना पोस्ट करता है और आउटेज के बारे में एक एसएमएस अलर्ट भेजता है। मुझे लगता है कि यह अपेक्षित आउटेज विंडो पर थोड़ा निर्भर करेगा (कब तक)।
htm11h

क्या यह खरगोश जैसा कुछ है?
जॉनी

जवाबों:


9

कुछ विकल्प।

एक निरंतर संचार चैनल का उपयोग करें

HTTP के बजाय, संदेश को एक कतार में छोड़ दें जो अत्यधिक उपलब्ध और लगातार है। जैसे कफका। जब तक लक्ष्य सर्वर किसी बिंदु पर उपलब्ध हो जाता है, तब तक उसे संदेश मिल जाएगा।

अब आपके पास जटिल उपतंत्र (कतार) का प्रावधान और प्रशासन करने का व्यापार बंद है। तो सुनिश्चित करें कि आप विश्लेषण करें कि क्या यह सार्थक है।

बैकऑफ़ और पुनः प्रयास करें

कॉलर ने असफल अनुरोध (संभवतः डिस्क के लिए जारी रखा) और समय-समय पर पुनः प्रयास करें। इस मामले में यह महत्वपूर्ण है कि आपके अनुरोध के बीच अंतर करने के कारण दुर्घटना हो सकती है या सेवा बस नीचे जा रही है। पूर्व शायद एक बग के कारण है और लॉग किया जाना चाहिए ... पुनर्प्रयास शायद एक फर्क नहीं पड़ता जब तक कि एक फिक्स नहीं किया जाता है।

पता लगाएँ और क्षतिपूर्ति करें

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

डिजाइन विकल्पों पर विचार करें

इस तरह का एक मामला संभवत: एक एपीआई गेटवे के लिए कॉल करता है ताकि प्रभावित माइक्रोसिस्टर्स को कॉल का प्रबंधन किया जा सके। इस तरह आप नियंत्रित करते हैं कि इस समस्या को कम करने के लिए कौन सी रणनीति का उपयोग किया जाता है। आप शायद उन कार्यान्वयन विवरणों के साथ ग्राहकों को बोझ नहीं बनाना चाहते हैं। सर्किट-ब्रेकर पैटर्न देखें ।

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

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

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


क्या यह RabbitMQ है?
जॉनी

क्या RabbitMQ आपके प्रश्न का उत्तर है? नहीं। यह एक समाधान का हिस्सा हो सकता है जो आपकी आवश्यकताओं को पूरा करता है, लेकिन यह आपकी समस्या को हल करने वाला नहीं है।
केसी स्पीकमैन

सिर्फ एक नोट। मुझे लगता है कि RabbitMQ संदेशों को जारी नहीं रखता है। इसका सेवन किया जाता है और कतार से हटाया जाता है, इसलिए NO। यदि आपको दृढ़ता और पुनः प्रयास की आवश्यकता है, तो RabbitMQ मदद नहीं करेगा।
Laiv

2

मुझे लगता है कि आप जो वर्णन कर रहे हैं, वह सर्वसम्मति की समस्या है: आप तब तक प्रतिबद्ध नहीं होना चाहते जब तक कि वितरित लेनदेन में प्रत्येक भागीदार का कहना है कि ऑपरेशन सफल रहा। इसका सरल उपाय है टू फेज कमिट। अनिवार्य रूप से यह प्रत्येक प्रणाली में लेन-देन को चरणबद्ध करता है जब तक कि प्रत्येक रिपोर्ट वापस न हो जाए कि मंचन सफल रहा (चरण 1)। यदि लेन-देन में प्रत्येक प्रतिभागी सफलता लौटाता है, तो प्रत्येक को वचनबद्ध किया जाता है; यदि उनमें से कोई भी असफलता लौटाता है, तो रोलबैक जारी किया जाता है (चरण 2)। इसमें एक शिकन है जो आपको अधिक जटिल तीन चरण प्रतिबद्ध समाधान की ओर ले जाती है। आप यहाँ प्रत्येक का बहुत बेहतर विवरण पढ़ सकते हैं:

http://the-paper-trail.org/blog/consensus-protocols-two-phase-commit/

http://the-paper-trail.org/blog/consensus-protocols-three-phase-commit/

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