यह एक क्लासिक प्रश्न है जो मुझे हाल ही में एक साक्षात्कार के दौरान पूछा गया था कि कैसे कई वेब सेवाओं को कॉल किया जाए और फिर भी कार्य के बीच में किसी प्रकार की त्रुटि से निपटने के लिए संरक्षित करें। आज, उच्च प्रदर्शन कंप्यूटिंग में, हम दो चरण के कमिट्स से बचते हैं। मैंने लेन-देन के लिए "स्टारबक मॉडल" कहा जाने वाला एक पेपर कई साल पहले पढ़ा था: स्टारबक पर आपके द्वारा ऑर्डर किए गए कॉफी का ऑर्डर देने, भुगतान करने, तैयार करने और प्राप्त करने की प्रक्रिया के बारे में सोचें ... मैं चीजों की देखरेख करता हूं लेकिन एक दो चरण वाला मॉडल। सुझाव दें कि पूरी प्रक्रिया में शामिल सभी चरणों के लिए एक एकल रैपिंग लेनदेन होगा जब तक आप अपनी कॉफी प्राप्त नहीं करते। हालांकि, इस मॉडल के साथ, सभी कर्मचारी इंतजार करेंगे और तब तक काम करना बंद कर देंगे जब तक आप अपनी कॉफी प्राप्त नहीं कर लेते। आप तस्वीर देखिए?
इसके बजाय, "सर्वश्रेष्ठ प्रयास" मॉडल का पालन करके और प्रक्रिया में त्रुटियों के लिए क्षतिपूर्ति करके "स्टारबक मॉडल" अधिक उत्पादक है। सबसे पहले, वे सुनिश्चित करते हैं कि आप भुगतान करते हैं! फिर, कप से जुड़े आपके आदेश के साथ संदेश कतारें हैं। यदि प्रक्रिया में कुछ गलत हो जाता है, जैसे कि आपको अपनी कॉफी नहीं मिली, तो यह नहीं है कि आपने क्या आदेश दिया है, आदि, हम मुआवजे की प्रक्रिया में प्रवेश करते हैं और हम यह सुनिश्चित करते हैं कि आप जो चाहते हैं, उसे प्राप्त करें या आपको वापस कर दें, यह सबसे कुशल मॉडल है उत्पादकता में वृद्धि के लिए।
कभी-कभी, स्टारबक एक कॉफी बर्बाद कर रहा है लेकिन समग्र प्रक्रिया कुशल है। जब आप अपनी वेब सेवाओं का निर्माण इस तरह करते हैं, तो उन्हें सोचने के लिए अन्य तरकीबें होती हैं, ताकि उन्हें किसी भी समय कहा जा सके और फिर भी वही अंतिम परिणाम प्रदान कर सकें। तो, मेरी सिफारिश है:
अपनी वेब सेवाओं को परिभाषित करते समय बहुत ठीक न हों (मैं इन दिनों हो रही सूक्ष्म-सेवा प्रचार के बारे में आश्वस्त नहीं हूं: बहुत दूर जाने के कई जोखिम);
Async प्रदर्शन बढ़ाता है इसलिए async होना पसंद करते हैं, जब भी संभव हो ईमेल द्वारा सूचनाएं भेजें।
किसी भी संख्या में उन्हें "वापस लेने योग्य" बनाने के लिए अधिक बुद्धिमान सेवाओं का निर्माण करें, एक यूआईडी या टास्किड के साथ प्रसंस्करण जो अंत तक शीर्ष क्रम का पालन करेगा, प्रत्येक चरण में व्यावसायिक नियमों को मान्य करेगा;
संदेश कतारों (JMS या अन्य) का उपयोग करें और उन प्रोसेसर को संभालने में त्रुटि करने के लिए डायवर्ट करें जो विपरीत कार्यों को लागू करके "रोलबैक" पर काम करेंगे, वैसे, async आदेश के साथ काम करने के लिए प्रक्रिया की वर्तमान स्थिति को मान्य करने के लिए किसी प्रकार की कतार की आवश्यकता होगी। तो उस पर विचार करें;
अंतिम उपाय में, (क्योंकि यह अक्सर नहीं हो सकता है), इसे त्रुटियों के मैनुअल प्रसंस्करण के लिए एक कतार में रखें।
चलिए पोस्ट की गई प्रारंभिक समस्या के साथ वापस चलते हैं। एक खाता बनाएं और एक वॉलेट बनाएं और सुनिश्चित करें कि सब कुछ किया गया था।
मान लीजिए कि एक वेब सेवा को पूरे ऑपरेशन को ऑर्केस्ट्रेट करने के लिए कहा जाता है।
वेब सेवा का छद्म कोड इस तरह दिखेगा:
खाता सृजन माइक्रोसर्विस को कॉल करें, इसे कुछ जानकारी दें और कुछ अद्वितीय कार्य आईडी 1.1 खाता निर्माण माइक्रोसॉफ़्ट पहले यह जांच करेगा कि क्या वह खाता पहले ही बनाया गया था। एक कार्य आईडी खाते के रिकॉर्ड के साथ जुड़ा हुआ है। Microservice पता लगाता है कि खाता मौजूद नहीं है इसलिए यह इसे बनाता है और कार्य आईडी संग्रहीत करता है। ध्यान दें: इस सेवा को 2000 बार कहा जा सकता है, यह हमेशा एक ही परिणाम करेगा। सेवा एक "रसीद के साथ जवाब देती है जिसमें एक पूर्ववत ऑपरेशन करने के लिए न्यूनतम जानकारी होती है यदि आवश्यक हो"।
वॉलेट निर्माण को कॉल करें, यह खाता आईडी और कार्य आईडी दे रहा है। मान लीजिए कि कोई शर्त मान्य नहीं है और वॉलेट निर्माण नहीं किया जा सकता है। कॉल त्रुटि के साथ देता है लेकिन कुछ भी नहीं बनाया गया था।
ऑर्केस्ट्रेटर को त्रुटि के बारे में बताया जाता है। यह जानता है कि इसे खाता निर्माण को निरस्त करने की आवश्यकता है लेकिन यह स्वयं ऐसा नहीं करेगा। यह चरण 1 के अंत में प्राप्त की गई "न्यूनतम पूर्ववत रसीद" को पारित करके वॉलेट सेवा को करने के लिए कहेगा।
खाता सेवा पूर्ववत रसीद को पढ़ती है और यह जानती है कि ऑपरेशन को कैसे करना है; पूर्ववत रसीद में एक और माइक्रोसर्विस के बारे में जानकारी भी शामिल हो सकती है जिसे वह खुद को नौकरी का हिस्सा बनाने के लिए कह सकता है। इस स्थिति में, पूर्ववत रसीद में खाता आईडी हो सकता है और संभवतः विपरीत ऑपरेशन करने के लिए कुछ अतिरिक्त जानकारी की आवश्यकता होती है। हमारे मामले में, चीजों को सरल बनाने के लिए, मान लें कि खाता अपनी खाता आईडी का उपयोग करके हटा दिया गया है।
अब, मान लें कि वेब सेवा को कभी भी सफलता या विफलता नहीं मिली (इस मामले में) कि खाता निर्माण का पूर्ववत प्रदर्शन किया गया था। यह बस खाते की पूर्ववत सेवा को फिर से कॉल करेगा। और यह सेवा सामान्य नहीं होनी चाहिए क्योंकि इसका लक्ष्य खाते के लिए मौजूद नहीं है। तो यह जाँचता है कि क्या यह मौजूद है और देखता है कि इसे पूर्ववत करने के लिए कुछ नहीं किया जा सकता है। तो यह रिटर्न करता है कि ऑपरेशन एक सफलता है।
वेब सेवा उस उपयोगकर्ता को लौटा देती है जो खाता नहीं बना सका।
यह एक समकालिक उदाहरण है। हम इसे एक अलग तरीके से प्रबंधित कर सकते थे और मामले को हेल्प डेस्क पर लक्षित संदेश कतार में डाल सकते थे यदि हम नहीं चाहते कि सिस्टम पूरी तरह से त्रुटि को ठीक करे "। मैंने देखा है कि यह एक कंपनी में किया जा रहा है जहां पर्याप्त नहीं है। स्थितियों को सही करने के लिए बैक एंड सिस्टम को हुक प्रदान किए जा सकते हैं। हेल्प डेस्क को संदेश प्राप्त हुए जिसमें सफलतापूर्वक प्रदर्शन किया गया था और चीजों को ठीक करने के लिए पर्याप्त जानकारी थी जैसे कि हमारे पूर्ववत रसीद का उपयोग पूरी तरह से स्वचालित तरीके से किया जा सकता है।
मैंने एक खोज की है और Microsoft वेब साइट पर इस दृष्टिकोण के लिए एक पैटर्न विवरण है। इसे क्षतिपूर्ति लेनदेन पैटर्न कहा जाता है:
लेन-देन का पैटर्न