एक घटना संचालित microservice वास्तुकला में परिवर्तन से निपटने


9

मैं एक शोध-परियोजना कर रहा हूँ जहाँ मैं एक घटना-चालित माइक्रो-सर्विस आर्किटेक्चर में परिवर्तनों को संभालने के लिए विकल्पों पर शोध कर रहा हूँ।

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

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

उस स्थिति में वास्तुकला में विभिन्न सेवाओं को इन घटनाओं (विशेषताओं आदि) की सामग्री के बारे में "अनुबंध" करने की आवश्यकता होती है। इसलिए इन घटनाओं के लिए सेवाओं में "शिथिल युग्मित निर्भरता" होती है

मेरा सवाल है: हम इन घटनाओं में परिवर्तन कैसे संभाल सकते हैं?

तो, मान लीजिए कि सेवा A एप्लिकेशन में नए उपयोगकर्ताओं को पंजीकृत करता है। तो यह एक "" UserRegistered "ईवेंट भेजता है। सेवा B उस ईवेंट को चुनता है और इसे संसाधित करता है। लेकिन सेवा सी की टीम के कुछ डेवलपर ने फैसला किया कि उन्हें एक पंजीकृत उपयोगकर्ता के लिंग की भी आवश्यकता है। इसलिए घटना को बदल दिया जाता है और विशेषता लिंग। "UserRegistered" ईवेंट में जोड़ा जाता है।

हम यह कैसे सुनिश्चित कर सकते हैं कि सेवा बी अभी भी उस अतिरिक्त विशेषता के साथ उसी घटना को फिर से तैयार कर सकती है जिसमें बिना रीडेपॉल्लिंग के अतिरिक्त विशेषता हो?

और क्या इस समस्या का सामना करने के लिए इन घटनाओं के लिए अन्य तरीके हैं?


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

मैं अपने संदेशों के लिए उपयोग करने के लिए एक प्रारूप चुनने में स्वतंत्र हूं। मुझे लगता है कि JSON का उपयोग करना सबसे अच्छा तरीका है। यह महत्वपूर्ण है कि इन विभिन्न सेवाओं को विभिन्न भाषाओं में बनाया गया है। यही कारण है कि XML या JSON जैसे एक सामान्य प्रारूप आवश्यक है।
CGeense

जवाबों:


1

इवेंट्स इस बारे में नहीं हैं कि क्या बदला है। वे तब के बारे में हैं जब कुछ बदला।

मैं पूरी तरह से बदली गई सामग्री से एक घटना प्रणाली बना सकता हूं। इस तरह से मैं एक घटना से सीखता हूं कि एक वस्तु को अपडेट किया गया है। अगर मुझे इस बात की भी परवाह है कि वस्तु को अपडेट कर दिया गया है, तो मैं बताऊंगा कि जो भी जानता है उस वस्तु से कैसे बात करें, यह पूछने के लिए कि क्या बदल गया है।

यह इन परिवर्तनों को संप्रेषित करने की समस्या को हल नहीं करता है। यह सिर्फ इवेंट सिस्टम का हिस्सा बनने से रोकता है।

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

उस बिल्ली को त्वचा देने के कई अन्य तरीके हैं, लेकिन मैंने उसे इस मामले में काम दिया है।


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

@ThomasOwens घटना के साथ डेटा भेजने का मतलब है कि अगर मेरे पास एन पर्यवेक्षक हैं तो मैं एन संदेश भेजता हूं। अकेले घटना को भेजने का मतलब है कि मैं केवल 1 पैकेट में 3N संदेश भेजता हूं। यह एक नेटवर्क पर भी ठीक तराजू है। केवल महत्वपूर्ण नकारात्मक पक्ष यह है कि आपके अंतराल को ट्रिपल करता है। यह कहते हुए कि आप किसी विशेष स्थिति के लिए अधिक इष्टतम समाधान नहीं खोज सकते। मैं दिखा रहा हूं कि इवेंट सिस्टम और डेटा संस्करण को युग्मित करने की आवश्यकता नहीं है।
candied_orange 14

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

1
यहाँ मुद्दा यह है कि घटना प्रणाली या आपको एक्स्टेंसिबल डेटा की आवश्यकता नहीं है। JSON या XML यदि आप पहले स्थापित किए गए नामों या संरचनाओं को नहीं बदलते हैं तो यह ठीक है। मैंने संग्रह के साथ भी यही किया है। इवेंट सिस्टम को जेंडर की परवाह नहीं करनी चाहिए। यदि यह डेटा भेज रहा है तो इसे बस उनके साथ पारित करना चाहिए और दूसरे छोर पर कुछ या तो लिंग की परवाह करेगा या यह नहीं करेगा।
कैंडिड_ऑरेंज सेप

1

पॉलीमॉर्फिक संदेश प्रेषण के साथ ईवेंट वर्जनिंग का उपयोग करके NServiceBus जैसे फ्रेमवर्क इसे संभालते हैं।

उदाहरण के लिए, सेवा A का संस्करण 1 IUserRegistered_v1 के रूप में एक घटना प्रकाशित कर सकता है। जब सेवा A संस्करण 1.1 में एक अतिरिक्त फ़ील्ड शामिल करने की आवश्यकता होती है, तो वह इंटरफ़ेस IUserRegistered_v1_1 की घोषणा कर सकता है, जो IUserRegistered_v1 से विरासत में मिलेगा और साथ ही कुछ अतिरिक्त फ़ील्ड भी घोषित करेगा।

जब सेवा A एक IUserRegistered_v1_1 ईवेंट प्रकाशित करता है, तो NServiceBus उन सभी समापन बिंदुओं पर संदेश भेजेगा जो IUserRegistered_v1 या IUserRegistered_v1_1 को हैंडल करते हैं।


0

वृद्धिशील सुधार

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

ठोस चट्टान

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

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

इसमें से कुछ आपके लिए क्या करने की आवश्यकता है, पर ओवरकिल हो सकता है, लेकिन मेरे अनुभव में अगर आपके पास यह देखने का एक सटीक तरीका नहीं है कि समय के साथ रिकॉर्ड कैसे बदल रहा है, तो आप या आपके डेटा के साथ काम करने वाला कोई व्यक्ति अंततः यही चाहेगा।


-1

@CandiedOrange एक्सएमएल जैसे एक्स्टेंसिबल डेटा फॉर्मेट के बारे में अपने स्वयं के उत्तर के लिए एक टिप्पणी में एक वैध बिंदु बनाता है।

जब तक आप डेटा जोड़ रहे हैं तब तक यह बात नहीं होनी चाहिए। हालांकि पुरानी घटनाओं / गैर-आवश्यक क्षेत्रों के लिए समझदार चूक प्रदान करें।

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

मैं हालांकि प्रासंगिक डेटा नहीं होने की घटनाओं से सहमत नहीं हूं। इवेंट सोर्सिंग के लिए, घटनाओं को परिभाषित करना चाहिए कि क्या बदल गया है। ईवेंट प्राप्त करने पर, अन्य सेवाओं को इवेंट के स्रोत से डेटा पुनर्प्राप्त नहीं करना चाहिए।


मेरा कहना है कि इसे सभी प्रकार के परिवर्तनों को संभालने की आवश्यकता है। ऐसी सेवा के बारे में सोचें जो किसी घटना को प्रसारित करती है। और उस घटना में एक संपत्ति शामिल है जो अप्रचलित है और इसे हटा दिया जाना चाहिए। यहां तक ​​कि अगर ये अन्य सेवाएं संपत्ति का उपयोग नहीं कर रहे हैं, तो यह उन्हें बस इसलिए तोड़ देगा क्योंकि वे इसकी उम्मीद कर रहे हैं। इसलिए मैंने इस लेख को martinfowler.com पर उपभोक्ता संचालित अनुबंधों के बारे में पढ़ा: martinfowler.com/articles/consumerDrivenContracts.html इस सिद्धांत को लागू करते समय। प्रत्येक प्रदाता (घटना) जानता है कि उससे क्या अपेक्षित है। यदि वह किसी भी कॉमरस को तोड़ता है, तो उस जानकारी को वह मान्य कर सकता है।
CGeense
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.