माइक्रो-सेवाओं और डेटा प्रतिकृति


14

मैं एक नया एप्लिकेशन बना रहा हूं और माइक्रो-सर्विसेज आर्किटेक्चर के बारे में पढ़ रहा था। वास्तुकला अपने आप में विकास, परिनियोजन और जीवन चक्र प्रबंधन के दृष्टिकोण से बहुत मायने रखता है। हालाँकि एक मुद्दा जो आया वह था मास्टर डेटा को कैसे संभालना है।

उदाहरण के लिए, मेरे पास 2 ऐप हैं - सेल्स ऐप और एक टिकटिंग ऐप। मान लें कि इन दोनों ऐप को स्वयं की सूक्ष्म सेवाओं के रूप में बनाया गया है। हालाँकि, ये दोनों ऐप, जब तैनात किए गए (यह मानते हुए कि वे अलग-अलग तैनात हैं, कहते हैं कि सेल्स MongoDB और टिकटिंग का उपयोग MariaDB करता है), को उसी मास्टर डेटा इंस्टेंसेस जैसे कि अकाउंट्स, प्रोडक्ट्स तक पहुंच की आवश्यकता होगी। इसका मतलब यह होगा कि किसी दिए गए मास्टर डेटा इकाई के लिए एक स्वामी ऐप होगा (जैसे खातों के लिए यह बिक्री ऐप हो सकता है) और एक इच्छुक पार्टी (जैसे टिकट ऐप को खातों के बारे में जानकारी होना आवश्यक है)।

ऐसे कई तरीके हैं जिनसे इसे प्राप्त किया जा सकता है: - मास्टर से इच्छुक पार्टी के लिए डेटा प्रतिकृति - रुचि पार्टी से मास्टर तक सिंक्रोनस रीड (सिंक निर्भरता माइक्रो-सर्विसेज आर्किटेक्चर प्रतिमान द्वारा अनुशंसित नहीं है) - स्वयं केंद्रीकृत भंडार

खातों के भीतर भी, एक मुख्य हिस्सा हो सकता है जो बिक्री और टिकट दोनों के लिए आम है (जैसे खाता नाम, पता आदि)। हालाँकि खाते के कुछ पहलू केवल बिक्री के लिए प्रासंगिक हो सकते हैं और अन्य केवल टिकटिंग के लिए प्रासंगिक हैं।

उपर्युक्त विकल्पों में से किसी के बारे में कोई विचार / सर्वोत्तम-व्यवहार / राय?


क्या आप माइक्रो सर्विसेज के रूप में भी अकाउंट और प्रोडक्ट नहीं बना सकते हैं? पूरी तरह से उन्हें "मास्टर डेटा इकाई" से अलग कर दें। बिक्री केवल किसी प्रकार की इकाई की बिक्री के बारे में जानती है, लेकिन यह जानने की आवश्यकता नहीं है कि इकाई एक उत्पाद, सेवा या किसी अन्य प्रकार की इकाई है जिसे आप बाद में जोड़ना चाहते हैं।
ब्लेकगाडाइजर

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

जवाबों:


12

मैं एक टीम का हिस्सा था जिसने सफलतापूर्वक एक सर्विस बस का उपयोग करके एक माइक्रोसॉफ़्ट आर्किटेक्चर का निर्माण किया।

प्रारंभ में, हम मानते थे कि माइक्रोसोर्सेज और एक इवेंट संचालित आर्किटेक्चर हमें अंतर्निहित साझा डेटा बॉल-ऑफ-कीड डेटाबेस को ठीक करने में सक्षम करेगा ।

हमने जो सीखा वह यह था कि माइक्रोसर्विस और एक इवेंट संचालित आर्किटेक्चर को हमें अंतर्निहित साझा डेटा बॉल-ऑफ-कीड डेटाबेस से छुटकारा पाने की आवश्यकता थी

मेरा मानना ​​है कि साझा डेटा माइक्रोसर्विस के साथ अच्छा करने के लिए अविश्वसनीय रूप से कठिन है - मेरे लिए यह निषेधात्मक रूप से कठिन है। मैं सेवाओं को एक दूसरे को डेटा देखने की अनुमति नहीं देने की सलाह देता हूं । यदि आप इसे क्वेरी नहीं कर सकते, तो आप गलती से एक निर्भरता का परिचय नहीं दे सकते।

यदि आप ऐसा शेयर डेटा, निश्चित रूप से केवल एक ही सेवा कभी भी एक रिकॉर्ड स्वामी हो सकते हैं; यह एकमात्र ऐसी सेवा है जो रिकॉर्ड को लिखती है, और समान डेटा के किसी अन्य उपयोगकर्ता को केवल एक्सेस तक पढ़ना चाहिए।

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

क्या होगा अगर मालिक डेटा को एक अलग आकार में जारी रखना चाहता है? फिर प्रत्येक पाठक सेवा को अद्यतन करने की आवश्यकता है। यह एक रखरखाव बुरा सपना है।

हमारे पास सबसे अच्छा समाधान हमारे डेटा का एक महत्वपूर्ण दोहराव और मूल्यह्रास था। माइक्रो सेवाओं ने उन डेटा की अपनी प्रतियाँ बनाए रखीं जिनकी उन्होंने परवाह की थी।

संदेशों को अक्सर उन्हें संसाधित करने के लिए पर्याप्त डेटा के साथ प्रकाशित किया गया था।

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

मैं सुझाव नहीं दे सकता कि कैसे सिंक्रनाइज़ डेटा के साथ आर्किटेक्ट समाधान। हमारे डेटा समाधान "अंतिम स्थिरता" के विचार के आसपास बनाए गए थे।

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

विचार यह है कि किसी भी समय किसी सेवा को एक महत्वपूर्ण कार्रवाई करनी होती है, उसके पास सूचनाओं की एक प्रति होनी चाहिए, जो सही तरीके से कार्य करने के लिए पर्याप्त हो, या तो स्वतंत्र रूप से ट्रैक की गई हो, या उस संदेश के भाग के रूप में जिसका वह जवाब दे रहा हो।


क्या आप स्वयं निर्मित समाधान या कुछ और का उपयोग करते हैं?
FrEaKmAn

2
हम NServiceBus का उपयोग कर रहे थे - जो प्रत्येक सेवा में होने वाले वर्कफ़्लो से निपटने के लिए विचारों / संरचनाओं का परिचय देता है। रावेनबीडी के माध्यम से दृढ़ता हो सकती है। आप पा सकते हैं कि आप किसी तकनीक को बहुत जल्दी नहीं चुनना चाहते हैं - आपकी परिस्थितियाँ भिन्न हो सकती हैं और हमारे पास शुरुआती मुद्दे थे। मार्टिन फ़ॉवलर के पास माइक्रोसॉफ़्ट सेवा शुरू करने वाले लोगों के लिए कुछ बहुत बढ़िया सलाह है: martinfowler.com/articles/microservices.html - "... आपको माइक्रोसेवा आर्किटेक्चर के साथ शुरू नहीं करना चाहिए। इसके बजाय एक मोनोलिथ के साथ शुरू करें, इसे मॉड्यूलर रखें, और विभाजित करें। एक बार मोनोलिथ में यह समस्या बन जाती है। "
परफेक्शनिस्ट

शॉर्ट में " हमारे पास सबसे अच्छा समाधान हमारे डेटा का एक महत्वपूर्ण दोहराव और मूल्यह्रास था। माइक्रो सेवाओं ने उन डेटा की अपनी प्रतियों को बनाए रखा जिनकी उन्होंने परवाह की थी। "
deFreitas

2

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

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


0

एक ही मास्टर डेटा उदाहरण जैसे खाते, उत्पाद तक पहुंच की आवश्यकता होगी

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

डोमेन ड्रिवेन डिज़ाइन में यह सामान्य है, जहाँ प्रत्येक बाध्य संदर्भ (एक ही ऐप में!) एक ही इकाई को एक अलग तरीके से मैप कर सकता है।

यदि आपको अधिक जानकारी की आवश्यकता है, तो मैं पुस्तक बिल्डिंग माइक्रोसर्विसेज: डिज़ाइनिंग फाइन-ग्रेनड सिस्टम्स की सिफारिश करता हूं


0

क्या आपने एक मास्टर सेट के आधार पर कंकाल रिकॉर्ड की अवधारणा पर विचार किया है?

उदाहरण के लिए एक microservice खाते संभालती है और दूसरे उत्पादों को संभालती है। एक तीसरा अपने डोमेन विशिष्ट उद्देश्य के लिए दोनों से रिकॉर्ड रख सकता है।

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