माइक्रोसर्विसेज में डेटा को सिंक्रोनाइज़ करने का उचित तरीका क्या है?


19

मैं microservice वास्तुकला के लिए अपेक्षाकृत नया हूँ। हमारे पास एक मामूली आकार का वेब अनुप्रयोग है और मैं एक अखंड प्रणाली के बजाय इसे आगे बढ़ाने के पेशेवरों और विपक्षों का वजन कर रहा हूं।

जहां तक ​​मैं इसे समझता हूं, माइक्रोसेवा पर विचार करें Aऔर Bजिनमें से प्रत्येक डेटा के एक सबसेट पर निर्भर है जो दूसरे के पास है। यदि कोई संदेश यह Aकहकर पोस्ट किया जाता है कि कुछ बदल गया है, तो Bउस संदेश का उपभोग कर सकते हैं और Aजानकारी की एक स्थानीय प्रति की नकल कर सकते हैं और इसका उपयोग कर सकते हैं कि जो भी Bकरने की आवश्यकता है।

हालाँकि, अगर Bनीचे जाता है / विफल रहता है और थोड़ी देर के बाद, फिर से वापस आता है। उस डाउन टाइम के दौरान, Aदो और संदेश प्रकाशित किए हैं। यह कैसे Bपता करता है कि इसकी स्थानीय प्रति को कैसे अपडेट किया जाए A?

दी गई है, यदि Bवह एकमात्र उपभोक्ता है A, तो वह इसे ऑनलाइन पढ़ना शुरू कर सकता है, लेकिन अगर उस कतार के अन्य उपभोक्ता हैं और उन संदेशों का उपभोग किया जाता है तो क्या होगा?

एक अधिक ठोस उदाहरण के रूप में, यदि किसी Usersसेवा में अपना ईमेल पता अपडेट किया Billingजाता है, जबकि एक माइक्रोसेवा डाउन होता है, अगर Billingमाइक्रोसेवा फिर से वापस आता है , तो यह कैसे पता चलेगा कि ईमेल अपडेट किया गया है?

जब माइक्रोसोर्सेज वापस आते हैं, तो क्या यह कहते हैं कि "मैं वापस आ रहा हूं, मुझे अपनी सभी वर्तमान जानकारी दें?"

सामान्य तौर पर डेटा सिंक्रनाइज़ेशन के लिए सबसे अच्छा उद्योग अभ्यास क्या होगा?


1
इससे बचने के लिए जब भी संभव हो।
तेलेस्टीन

1
Ordersइसके बारे में कुछ भी जानने की आवश्यकता क्यों है Users?
kdgregory

यह सिर्फ एक उदाहरण है। आप जो चाहते हैं उससे दो को बदलें।
नोबेलारे जुले

एक फैन आउट रूटिंग आपके 'संदेश को किसी और की समस्या से भस्म हो जाएगा' को हल कर देगा। लेकिन यह वास्तव में स्पष्ट नहीं है कि आप क्या हासिल करने की कोशिश कर रहे हैं।
इवान

@ इवान ने जो बताने की कोशिश की है उसे बेहतर ढंग से समझाने के लिए मैंने अपनी मूल पोस्ट अपडेट की है।
नोबेलरेयर

जवाबों:


5

मैं "आपके डेटा को अन्य सभी माइक्रोसॉफ़्टर्स पर धकेलने" के अपने पूरे विचार को चुनौती दूंगा।

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


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

2
आपके उत्तर के लिए धन्यवाद। तो फिर एक पब / उप मॉडल और संदेश कतारों की आवश्यकता क्यों है? यदि हम "पुश" डेटा के बजाय "पुल" करने की कोशिश कर रहे हैं, तो हम सेवा विलंबता से चिंतित हैं।
noblerare

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

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

@dukethrash फिर उन्हें अत्यधिक उपलब्ध कराएं।
जे। फबियन

5

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

घटना सोर्सिंग

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

यह इस बात को पूरा करने में मदद करता है कि यदि कोई माइक्रोसेवक नीचे जाता है, तो अन्य घटनाओं के अनुसार यह प्रकाशित हो रही है और घटनाओं का उपभोग किया जाता है, कहते हैं, उस माइक्रोसॉर्स्ट के अन्य उदाहरण, जब वह माइक्रोसॉर्क्स वापस आता है, तो यह event storeसभी को पुनः प्राप्त करने के लिए इसे संदर्भित कर सकता है घटनाओं है कि यह अवधि के दौरान चूक गया यह नीचे चला गया।

इवेंट ब्रोकर के रूप में अपाचे काफ्का

अपाचे काफ्का के उपयोग पर विचार करें जो प्रति सेकंड हजारों घटनाओं को संग्रहीत और प्रेषित कर सकता है और इसमें अंतर्निहित प्रतिकृति और दोष-सहिष्णु तंत्र हैं। इसमें उन घटनाओं का लगातार संग्रह होता है, जिन्हें डिस्क पर अनिश्चित काल तक संग्रहीत किया जा सकता है और किसी भी समय (लेकिन हटाया नहीं जाता) टॉपिक (काफ्का के फैंसी कतार) से भस्म कर दिया जाता है।

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

वास्तव में, जब उपभोक्ता खुद को काफ्का के लिए पहचानते हैं, तो काफ्का रिकॉर्ड करेगा कि कौन से संदेश किस उपभोक्ता तक पहुंचाए गए ताकि वह उसे फिर से सेवा न दे।

गाथा

अधिक जटिल usecases के लिए जहां विभिन्न सेवाओं के बीच संचार वास्तव में आवश्यक है, usecase को खत्म करने की जिम्मेदारी को अच्छी तरह से मान्यता दी जानी चाहिए - usecase को विकेंद्रीकृत किया जाता है और केवल तभी पूरा होता है जब इसमें शामिल सभी सेवाएँ अपने कार्य को सफलतापूर्वक पूरा करने के रूप में स्वीकार करती हैं, अन्यथा पूरा usecase विफल होना चाहिए और किसी भी अमान्य स्थानीय स्थिति को रोलबैक करने के लिए सुधारात्मक उपायों को चालू किया जाना चाहिए।

यह तब है जब गाथा खेल में आती है। एक गाथा स्थानीय लेनदेन का एक क्रम है। प्रत्येक स्थानीय लेनदेन डेटाबेस को अपडेट करता है और गाथा में अगले स्थानीय लेनदेन को ट्रिगर करने के लिए एक संदेश या घटना प्रकाशित करता है। यदि कोई स्थानीय लेनदेन विफल हो जाता है क्योंकि यह एक व्यावसायिक नियम का उल्लंघन करता है, तो गाथा उन लेनदेन की क्षतिपूर्ति की एक श्रृंखला को निष्पादित करती है जो पूर्ववर्ती स्थानीय लेनदेन द्वारा किए गए परिवर्तनों को पूर्ववत करते हैं। अधिक जानकारी के लिए इसे पढ़ें ।


मुझे अभी भी समझ में नहीं आया कि आप ऐसी जटिल संरचना का निर्माण क्यों करना चाहते हैं। यह आमतौर पर बहुत आसान है यदि प्रत्येक सेवा केवल अपना डेटा रखती है और अनुरोध पर अन्य सेवाओं को देती है।
जे। फैबियन मीर

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

1

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

अब माइक्रोसिस्ट को पता है कि एक संदेश अंततः दिया जाता है, लेकिन यह पर्याप्त नहीं है: जिस तरह से यह एक संदेश की डिलीवरी की उम्मीद करता है? क्या यह एक ही घटना अधिसूचना की कई प्रतियों के वितरण का प्रबंधन कर सकता है? यह डिलीवरी शब्दार्थ (कम से कम एक बार, बिल्कुल एक बार) की बात है

अंतिम विचार):

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

  2. यहां तक ​​कि ब्रोकर भी विफल हो सकता है, इस मामले में संदेश खो जाते हैं

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


0

आप एक सामान्य ईवेंट कतार को एक प्रकाशक / ग्राहक मॉडल के साथ बदल सकते हैं, जहाँ Aसेवा विषय T का एक नया संदेश प्रकाशित करती है और Bउसी प्रकार के माइक्रोसॉर्क्स सेवा का एक ही विषय होगा।

आदर्श रूप Bसे एक स्टेटलेस सेवा होगी, और यह एक अलग दृढ़ता सेवा का उपयोग करेगी, जैसे कि एक असफल Bसेवा उदाहरण को एक Bही साझा सेवा इंस्टेंसेस से पढ़ना, अपना काम जारी रखने के लिए एक या एक से अधिक सेवा उदाहरणों को बदलकर किया जाएगा ।


0

यदि A संदेश द्वारा यह कहते हुए पोस्ट किया जाता है कि कुछ बदल गया है, तो B उस संदेश का उपभोग कर सकता है और A की जानकारी की एक स्थानीय प्रति की नकल कर सकता है और उपयोग कर सकता है कि B को जो भी करने की आवश्यकता है।

यदि आप चाहते थे कि बी ए के आंतरिक डेटा का उपयोग करने में सक्षम हो, तो आप इसे ए के आंतरिक डेटाबेस तक पहुंच देना बेहतर होगा।

हालाँकि, आपको ऐसा नहीं करना चाहिए, सेवा उन्मुख वास्तुकला का पूरा बिंदु यह है कि सेवा B सेवा A की आंतरिक स्थिति नहीं देख सकता है और यह REST API (और इसके विपरीत) के माध्यम से अनुरोध करने तक सीमित है।

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

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