ऐसे कई उपाय हैं जो मैं जितना सहज हूं उससे अधिक समझौता करता हूं। दी, यदि आपका उपयोग मामला जटिल है, जैसे कि विभिन्न बैंकों के बीच पैसा घूमना, तो अधिक सुखद विकल्प असंभव हो सकते हैं। लेकिन आइए देखें कि हम सामान्य परिदृश्य में क्या कर सकते हैं, जहां माइक्रोसर्विस का उपयोग हमारे-होने वाले डेटाबेस लेनदेन के साथ हस्तक्षेप करता है।
विकल्प 1: यदि संभव हो तो लेनदेन की आवश्यकता से बचें
स्पष्ट और पहले उल्लेख किया है, लेकिन आदर्श अगर हम इसे प्रबंधित कर सकते हैं। क्या घटक वास्तव में एक ही microservice से संबंधित थे? या क्या हम सिस्टम को फिर से डिज़ाइन कर सकते हैं ताकि लेनदेन अनावश्यक हो जाए? शायद गैर-लेन-देन को स्वीकार करना सबसे सस्ती कुर्बानी है।
विकल्प 2: एक कतार का उपयोग करें
यदि पर्याप्त निश्चितता है कि दूसरी सेवा हम जो भी करना चाहते हैं उस पर सफल होंगे , हम इसे किसी न किसी रूप में कतार के माध्यम से कह सकते हैं। पंक्तिबद्ध आइटम को बाद में नहीं उठाया जाएगा, लेकिन हम यह सुनिश्चित कर सकते हैं कि आइटम पंक्तिबद्ध है ।
उदाहरण के लिए, यह कहें कि हम एक इकाई को सम्मिलित करना चाहते हैं और एक ही लेनदेन के रूप में एक ई-मेल भेजना चाहते हैं। मेल सर्वर को कॉल करने के बजाय, हम ई-मेल को एक तालिका में पंक्तिबद्ध करते हैं।
Begin transaction
Insert entity
Insert e-mail
Commit transaction
एक स्पष्ट दोष यह है कि एक से अधिक microservices को एक ही तालिका तक पहुंच की आवश्यकता होगी।
विकल्प 3: लेनदेन पूरा करने से ठीक पहले बाहरी काम करें
यह दृष्टिकोण इस धारणा पर टिकी हुई है कि लेनदेन करने में विफल होने की संभावना बहुत कम है।
Begin transaction
Insert entity
Insert another entity
Make external call
Commit transaction
यदि क्वेरी विफल हो जाती है, तो बाहरी कॉल अभी तक नहीं हुई है। यदि बाहरी कॉल विफल हो जाती है, तो लेनदेन कभी भी प्रतिबद्ध नहीं होता है।
यह दृष्टिकोण उन सीमाओं के साथ आता है जिन्हें हम केवल एक बाहरी कॉल कर सकते हैं, और इसे अंतिम रूप से किया जाना चाहिए (अर्थात हम अपने प्रश्नों में इसके परिणाम का उपयोग नहीं कर सकते हैं)।
विकल्प 4: लंबित स्थिति में चीजें बनाएं
जैसा कि यहां पोस्ट किया गया है , हमारे पास कई माइक्रोसर्विसेज अलग-अलग घटक बना सकते हैं, प्रत्येक एक लंबित स्थिति में, गैर-लेन-देन में।
कोई भी सत्यापन किया जाता है, लेकिन कुछ भी निश्चित स्थिति में नहीं बनाया जाता है। सब कुछ सफलतापूर्वक बनाए जाने के बाद, प्रत्येक घटक सक्रिय होता है। आमतौर पर, यह ऑपरेशन इतना सरल है और कुछ गलत होने की संभावनाएं इतनी कम हैं, कि हम सक्रिय रूप से गैर-सक्रिय रूप से भी करना पसंद कर सकते हैं।
सबसे बड़ी कमी शायद यह है कि लंबित वस्तुओं के अस्तित्व के लिए हमें जिम्मेदार होना चाहिए। किसी भी चुनिंदा प्रश्न पर विचार करने की आवश्यकता है कि क्या लंबित डेटा शामिल करना है। ज्यादातर को इसे नजरअंदाज करना चाहिए। और अपडेट पूरी तरह से एक और कहानी है।
विकल्प 5: माइक्रोसर्विस को इसकी क्वेरी को साझा करने दें
अन्य विकल्पों में से कोई भी आपके लिए नहीं है? तो फिर चलो अपरंपरागत हो जाओ ।
कंपनी के आधार पर, यह अस्वीकार्य हो सकता है। मुझे पता है। यह अपरंपरागत है। यदि यह स्वीकार्य नहीं है, तो किसी अन्य मार्ग पर जाएं। लेकिन अगर यह आपकी स्थिति में फिट बैठता है, तो यह समस्या को सरल और शक्तिशाली रूप से हल करता है। यह सिर्फ सबसे स्वीकार्य समझौता हो सकता है।
एक से अधिक माइक्रो सर्वर से प्रश्नों को सरल, एकल डेटाबेस लेनदेन में बदलने का एक तरीका है।
इसे निष्पादित करने के बजाय क्वेरी वापस करें।
Begin transaction
Execute our own query
Make external call, receiving a query
Execute received query
Commit transaction
नेटवर्क-वार, प्रत्येक माइक्रोसेवक को प्रत्येक डेटाबेस तक पहुंचने में सक्षम होना चाहिए। भविष्य में स्केलिंग के संबंध में भी इसे ध्यान में रखें।
यदि लेनदेन में शामिल डेटाबेस एक ही सर्वर पर हैं, तो यह एक नियमित लेनदेन होगा। यदि वे विभिन्न सर्वरों पर हैं, तो यह एक वितरित लेनदेन होगा। कोड समान रूप से समान है।
हम इसके कनेक्शन प्रकार, इसके मापदंडों और इसके कनेक्शन स्ट्रिंग सहित क्वेरी प्राप्त करते हैं। प्रवाह को पठनीय रखते हुए हम इसे एक साफ-सुथरी निष्पादन योग्य कमांड क्लास में लपेट सकते हैं: माइक्रोसेर कॉल का परिणाम एक कमांड में होता है, जिसे हम अपने लेनदेन के हिस्से के रूप में निष्पादित करते हैं।
कनेक्शन स्ट्रिंग वह है जो उत्पन्न करने वाला माइक्रोसर्विस हमें देता है, इसलिए सभी इरादों और उद्देश्यों के लिए, क्वेरी को अभी भी उस माइक्रोसॉर्स्ट द्वारा निष्पादित माना जाता है। हम सिर्फ ग्राहक माइक्रो सर्विस के माध्यम से इसे भौतिक रूप से रूट कर रहे हैं। क्या इससे कुछ अन्तर पड़ता है? ठीक है, यह हमें उसी लेनदेन में दूसरी क्वेरी के साथ डाल देता है।
यदि समझौता स्वीकार्य है, तो यह दृष्टिकोण हमें एक microservice वास्तुकला में एक अखंड आवेदन की सीधी लेन-देन देता है।