क्या सेवाओं को एक दूसरे से सीधे एक माइक्रोसॉर्स्क वास्तुकला में बात करनी चाहिए?


10

मेरे पास कई वेब सेवाएँ हैं जो वेब एप्लिकेशन बनाती हैं। ग्राहक REST API कॉल के माध्यम से इन सेवाओं का उपयोग कर सकते हैं।

क्या इन सेवाओं को एक दूसरे से सीधे बात करने में सक्षम होना चाहिए? यदि ऐसा नहीं होता है तो उन्हें युगल बनाते हैं जो कि microservices पर अवधारणा के खिलाफ जाता है?

क्या क्लाइंट को वेब पर लोड करने के लिए एक के बाद एक उन्हें सीधे कॉल करना चाहिए जिससे क्लाइंट पर वेब पेज लोड हो सके?

या क्या मुझे अपनी सेवाओं के शीर्ष पर एक और परत होनी चाहिए, जो क्लाइंट से अनुरोध को संभालती है, उस अनुरोध के लिए डेटा प्राप्त करती है और फिर इसे क्लाइंट को वापस भेजती है?


अगर चीजें पूरी तरह से अनकैप्ड हैं तो वे पूरी तरह से अलग उत्पाद हैं। तो उपयोगकर्ता को कॉन्टोसो लॉगिन में लॉग इन करना होगा, फिर कॉन्टोसो लॉगिन कहेंगे "अब आप लॉग इन हैं!" ... और फिर वे कॉन्टोसो सेंसिटिव डेटा स्टोरेज में जाते हैं, बॉक्स पर टिक करें जो कहता है "हां, मैं लॉग इन हूं।" "... तो उस से डेटा कॉपी करें जो कॉन्टोसो डेटा प्रोसेसर में है ...
user253751

जवाबों:


16

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

अंत में, आपके पास माइक्रोसर्विसेस एप्लिकेशन होगा जो कि वैकल्पिक मोनोलिथ ऐप की तुलना में धीमा है, लेकिन लगभग सभी समान समस्याएं हैं!

मुझे @ रोबर्ट हार्वे से असहमत होना होगा

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

एकीकरण डेटाबेस अच्छी तरह से ज्ञात एंटीपैटर्न है

आपकी सेवाओं के बीच अतुल्यकालिक संचार करने के लिए एक बेहतर समाधान प्रकाशन-सदस्यता पैटर्न का उपयोग करना है:

यहां छवि विवरण दर्ज करें

कृपया संचार के इस तरीके को लागू करने के CQRS / ES तरीके पर एक नज़र डालें, ग्रेग यंग और अन्य लोग इस विषय पर कई अच्छे वीडियो पेश करते हैं। बस "CQRS / ES" कीवर्ड के लिए Google। इस दृष्टिकोण में, प्रत्येक सेवा एक ही समय में प्रकाशक और ग्राहक बन जाएगी, जिससे सेवाएं बहुत कम युग्मित हो सकेंगी।

यहाँ उन विषयों के बारे में विवादों पर प्रकाश डालती है जो कि माइक्रोसेर्वर के बारे में लेखों की एक अच्छी श्रृंखला है । अच्छा चित्रण के साथ बहुत विस्तृत विवरण।


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

धन्यवाद रॉबर्ट, मैंने फाउलर के लेख को बेहतर तरीके से विचार करने के लिए जोड़ा है, न कि प्राधिकरण से बहस करने के लिए। जिस तरह से आपने उस दृष्टिकोण का वर्णन किया है वह एकीकरण डेटाबेस एक जैसा लगता है। यदि यह अलग है - यह बिल्कुल स्पष्ट नहीं है। सही परिस्थितियों के बारे में - मुझे लगता है कि डेटाबेस के माध्यम से माइक्रोसर्विस को एकीकृत करना एक अच्छा विचार नहीं है क्योंकि यह हमें एक अखंड वास्तुकला में वापस धकेल देता है।
इलियाकली १०'१I

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

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

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

8

SOA के बारे में Udi Dahan का क्या कहना है यह पढ़कर आपको बहुत अच्छे विचार आएंगे

एक सेवा एक विशिष्ट व्यावसायिक क्षमता के लिए तकनीकी प्राधिकरण है। डेटा या नियम का कोई भी टुकड़ा केवल एक सेवा के स्वामित्व में होना चाहिए।

इसका मतलब यह है कि जब भी सेवाएं एक-दूसरे की घटनाओं को प्रकाशित और सब्सक्राइब करती हैं, तो हम हमेशा जानते हैं कि डेटा के हर टुकड़े और नियम के लिए सत्य का आधिकारिक स्रोत क्या है।

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

विशेष रूप से यूआई रचना के संबंध में, मीयू सर्वेंटी का यूआई रचना पर लेख एक अच्छा प्रारंभिक बिंदु है। उदी का वीडियो भी देखें, यहां उपलब्ध है

क्या इन सेवाओं को एक दूसरे से सीधे बात करने में सक्षम होना चाहिए? यदि ऐसा नहीं होता है तो उन्हें युगल बनाते हैं जो कि microservices पर अवधारणा के खिलाफ जाता है?

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

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


7

यह निर्भर करता है कि आप "सीधे" से क्या मतलब है।

यह पूरी तरह से ठीक है, माइक्रोसर्विस आर्किटेक्चर के अनुसार, अन्य सेवाओं को या तो अपने स्वयं के सर्वर पर, या बाहरी सर्वरों पर भी, REST जैसे कुछ इंटरफेस के माध्यम से, माइक्रोसेवर्सीज़ का उपयोग किया जाता है।

जो ठीक नहीं है, वह एक माइक्रोसेवा के लिए है ताकि वह दूसरी विधि का उपयोग कर चालान कर सके; जो दोनों माइक्रोसेरो को एक ही मोनोलिथ का हिस्सा बना देगा।


यह ठीक नहीं है और इसके बुरे परिणाम होंगे। अधिक जानकारी के लिए मेरा जवाब देखें।
इलियाकली

@IlliakaillI मैं यह कह रहा हूं कि यह "माइक्रोसॉर्क्स आर्किटेक्चर के अनुसार" ठीक है। मैं यह सुझाव नहीं दे रहा हूं कि माइक्रोसॉफ़्ट आर्किटेक्चर परिणामों से मुक्त है, या यह कि इसमें कोई सुधार नहीं हैं। यहाँ सवाल "पुस्तक द्वारा एक्स है, या नहीं?" और सही उत्तर यह है कि X की सही परिभाषा दी गई है, यह पुस्तक द्वारा है।
माइक नाइस

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

5

क्या इन सेवाओं को एक दूसरे से सीधे बात करने में सक्षम होना चाहिए? यदि ऐसा नहीं होता है तो उन्हें युगल बनाते हैं जो कि microservices पर अवधारणा के खिलाफ जाता है?

कपलिंग एक बुरा शब्द नहीं है। प्रत्येक एप्लिकेशन के पास पहले से ही युग्मन की एक निश्चित डिग्री है; आपके माइक्रोसर्विसेज से बात करने वाले एप्लिकेशन पहले से ही माइक्रोसॉर्क्स के लिए युग्मित हैं , अन्यथा वे काम नहीं करेंगे।

क्या आप वास्तव में microservices के साथ ढीली युग्मन के बाद कर रहे हैं ; आप यह हासिल कर सकते हैं कि केवल एक माइक्रोसेवा से दूसरे को उसके सार्वजनिक एपीआई के माध्यम से या एक इवेंट बस का उपयोग करके पूछताछ की जा सकती है।

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


3
"एकीकरण डेटाबेस" प्रसिद्ध एंटीपैटर्न है, अधिक विवरण के लिए मेरा जवाब देखें।
इलियाकली

2

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

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


1

क्या क्लाइंट को वेब पर लोड करने के लिए एक के बाद एक उन्हें सीधे कॉल करना चाहिए जिससे क्लाइंट पर वेब पेज लोड हो सके?

निर्भर करता है; हालाँकि, मैं ग्राहक को सीधे प्रयोग करने योग्य क्षमताएँ प्रदान करने और छिपाने (इनकैप्सुलेट करने) का सुझाव दूंगा कि परिणाम कैसे इकट्ठे किए जाते हैं (जैसे कई सूक्ष्म सेवाओं के माध्यम से)।

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

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


(इसके अलावा, क्लाइंट के लिए राउंड ट्रिप आपके माइक्रोसर्विसेज से एक दूसरे की तुलना में अधिक महंगे हैं।)


यदि आप उदाहरण के लिए, ग्राफ़कॉल द्वारा ली जा रही दिशा को देखते हैं, तो आपको क्लाइंट को सीधे प्रासंगिक प्रश्न जारी करने वाले एक समापन बिंदु मिलेंगे, जो कि माइक्रोसर्विस के संग्रह के रूप में लागू हो भी सकता है और नहीं भी। जैसा कि माइक्रोसर्विस का आर्किटेक्चर ग्राफकलाइन के पीछे छिपा हुआ है, जिससे आर्किटेक्चर को रिफ्लेक्टर करने में आसानी होती है और क्लाइंट को फ्रेंडली भी। उदाहरण के लिए देखें, https://stackoverflow.com/a/38079681/471129


1

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

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