माइक्रोसर्विसेज में डीटीओ को साझा करने के तरीके?


33

मेरा परिदृश्य इस प्रकार है।

मैं विभिन्न प्रकार के सेंसर से डेटा प्राप्त करने के लिए डिज़ाइन की गई प्रणाली को डिजाइन कर रहा हूं, और बाद में विभिन्न फ्रंट-एंड और एनालिटिक्स सेवाओं द्वारा उपयोग किए जाने के लिए इसे बनाए रखता हूं।

मैं हर सेवा को यथासंभव स्वतंत्र बनाने की कोशिश कर रहा हूं, लेकिन मुझे थोड़ी परेशानी हो रही है। टीम ने एक डीटीओ पर फैसला किया है जिसका हम उपयोग करना चाहते हैं। आउटवर्ड-फेसिंग सेवाओं (सेंसर डेटा प्राप्तकर्ताओं) को अपने स्वयं के अनूठे तरीके से डेटा प्राप्त होगा, फिर इसे JSON ऑब्जेक्ट (DTO) में कनवर्ट करें और इसे संदेश ब्रोकर को भेजें। संदेशों के उपभोक्ता तब ठीक से जान पाएंगे कि सेंसर डेटा संदेशों को कैसे पढ़ा जाता है।

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

क्या मैं सिस्टम को गलत बनाने के बारे में जा रहा हूं? यदि नहीं, तो इसके बारे में कुछ तरीके क्या हैं, या कम से कम मेरी चिंताओं को कम करने के लिए?


आप किस तरह के डीटीओ साझा कर रहे हैं, और सेवाओं के बीच आप किस प्रोटोकॉल का उपयोग कर रहे हैं? उदाहरण के लिए, protoजीआरपीसी के लिए फ़ाइल या avroकाफ्का के लिए स्कीमा और दोनों सेवाओं में डीटीओ को उत्पन्न करना ठीक है, लेकिन मैं दो परियोजनाओं के बीच एक साझा पुस्तकालय साझा नहीं करूंगा।
विंसेंट सवार्ड

एन्कोडेड JSON स्ट्रिंग्स और AMQP। मैं किसी भी भाषा-विशेष का उपयोग नहीं करना पसंद करूंगा।
nbaughman 3

जवाबों:


38

मेरी सलाह? किसी भी प्रकार के पुस्तकालय में अनुप्रयोगों के बीच इन डीटीओ को साझा न करें । या कम से कम अभी यह मत करो।

मुझे पता है, बहुत ही सहज ज्ञान युक्त लगता है। आप कोड डुप्लिकेट कर रहे हैं, है ना? लेकिन यह एक व्यावसायिक नियम नहीं है, इसलिए आप अधिक लचीले हो सकते हैं।

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

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

लेकिन अगर यह स्थिति आपको परेशान कर रही है, तो आप तीन के नियम का पालन ​​कर सकते हैं :

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

इसलिए, सेवाओं के बीच इस डीटीओ को साझा करने से पहले थोड़ा और इंतजार करने का प्रयास करें।


1
बहुत ज्यादा अधिमूल्यित। यह वास्तव में बहुत ही प्रमुख चिंताओं में से एक है जिसे मैंने आगे बढ़ाया है। मुझे रात में रखने के लिए पर्याप्त नहीं है, लेकिन मुझे चिंता करने के लिए पर्याप्त है।
nbaughman 3

4
डुप्लीकेट डीटीओ (अलग और बहुत स्वतंत्र सेवाओं में) DRY का उल्लंघन नहीं करते हैं। बस।
लैवि

3
संभवतः तब कोई कारण नहीं है कि डीटीओ स्रोत कोड को एक प्रोजेक्ट से दूसरे प्रोजेक्ट में सीधे एक-ऑफ ऑपरेशन के रूप में कॉपी नहीं किया जा सकता है, हालांकि फिर नए प्रोजेक्ट में आवश्यक किसी भी हिस्से को हटाया नहीं जाना चाहिए।
bdsl

1
यहां तक ​​कि एक पूरी सेवा को हटा दिया जा सकता है जिससे पूरे सिस्टम को कोई बड़ी समस्या न हो। आदर्श रूप में।
लैवि

4
उत्तर के सार को स्पष्ट करने के लिए, जब माइक्रोसिस्टर्स विकसित कर रहे हैं, तो प्रत्येक सेवा को विकसित किया जाना चाहिए जैसे कि उन्हें अन्य सेवाओं के बारे में नहीं पता है, इसके लिए वास्तविक अनुबंधों को छोड़कर।
जोनाथन वैन डे वीन

12

जब माइक्रोसॉर्विस की बात आती है, तो सेवाओं का विकास जीवन चक्र भी स्वतंत्र होना चाहिए। *

विभिन्न एसएलडीसी और विभिन्न देव टीमें

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

विभिन्न आवश्यकताओं, विभिन्न प्रौद्योगिकियों

पृथक SLDCs भी टीमों को स्टैक का चयन करने की अनुमति देता है जो उनकी आवश्यकताओं के अनुसार सबसे अच्छा है। किसी विशिष्ट तकनीक में कार्यान्वित डीटीओ को चुनना टीमों की चुनने की क्षमता को सीमित करता है।

डीटीओ न तो व्यावसायिक नियम हैं और न ही सेवा अनुबंध

डीटीओ वास्तव में क्या हैं? एक तरफ से दूसरी ओर जाने वाले डेटा की तुलना में कोई अन्य लक्ष्य नहीं है। गेटर्स और सेटर का बैग। यह "ज्ञान" की तरह नहीं है जो पुन: उपयोग के लायक है, कुल मिलाकर क्योंकि वहाँ बिल्कुल भी ज्ञान नहीं है। उनकी अस्थिरता उन्हें युग्मन के लिए बुरा उम्मीदवार भी बनाती है।

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

विभिन्न व्यवसाय, विभिन्न व्याख्याएं

हालांकि, सेवाओं के बीच क्रॉस-कटिंग अवधारणाएं हो सकती हैं (इसका मतलब यह नहीं है कि हमें सभी सेवाओं को उसी तरह व्याख्या करने के लिए मजबूर करने के लिए एक विहित मॉडल लागू करना होगा।

मामले का अध्ययन

मान लें कि हमारी कंपनी के तीन विभाग हैं, ग्राहक सेवा , बिक्री और शिपिंग । कहते हैं कि इनमें से प्रत्येक एक या अधिक सेवाएं जारी करता है।

ग्राहक सेवा, अपनी डोमेन भाषा के कारण, ग्राहकों की अवधारणा के आसपास सेवाओं को लागू करती है, जहाँ ग्राहक व्यक्ति होते हैं । उदाहरण के लिए, ग्राहकों को नाम , अंतिम नाम , आयु , लिंग , ईमेल , फोन आदि के रूप में मॉडल किया जाता है ।

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

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

सम्बंधित लिंक्स


* यहाँ है जहाँ इस वास्तुकला की ताकत पर देता है


धन्यवाद! केस स्टडीज़ वास्तव में वही हैं जो मुझे यह निर्धारित करने में मदद करती हैं कि डीटीओ को साझा करना है या नहीं। अब मुझे यकीन है कि मैं उन्हें साझा क्यों नहीं करना चाहता था।
इगोर

8

मैं हर सेवा को यथासंभव स्वतंत्र बनाने की कोशिश कर रहा हूं

आपको घटनाओं को प्रकाशित करना चाहिए । ईवेंट कुछ प्रकार के संदेश होते हैं जो किसी विशेष बिंदु पर उस समय के बारे में एक ठोस तथ्य का प्रतिनिधित्व करते हैं ।

प्रत्येक सेवा में एक बहुत अच्छी तरह से परिभाषित जिम्मेदारी होनी चाहिए, और उस जिम्मेदारी से संबंधित घटनाओं को प्रकाशित करने की जिम्मेदारी होनी चाहिए।

इसके अलावा, आप चाहते हैं कि आपकी घटनाएं व्यवसाय संबंधी घटनाओं का प्रतिनिधित्व करें, न कि तकनीकी घटनाओं का। उदाहरण के साथ OrderCancelledईवेंट पसंद करते हैं ।OrderUpdatedstatus: "CANCELLED"

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

लेकिन अगर सेवा में केवल OrderUpdatedघटनाओं को सुनना होता है, तो इसे घटनाओं के प्रवाह पर व्याख्या करने की आवश्यकता होगी, और यह अब आदेश को रद्द करने के लिए सही ढंग से समाप्त करने के लिए वितरण के आदेश पर निर्भर था।

आपके मामले में, हालांकि, अपने सेंसर डाटा प्रकाशित कर रहे हैं के रूप में, यह मतलब हो सकता है एक सेवा के लिए, घटनाओं को सुनने और "व्यापार की घटनाओं", जैसे की एक नई धारा प्रकाशित TemperatureThresholdExceeded, TemperatureStabilised

और बहुत सारे माइक्रोसेवा बनाने के बारे में सावधान रहें। माइक्रोसेप्सशिप जटिल जटिलता का एक शानदार तरीका हो सकता है, लेकिन यदि आप उपयुक्त सेवा सीमाओं की खोज नहीं करते हैं, तो आपकी जटिलता सेवा एकीकरण में है। और वह बनाए रखने के लिए एक बुरा सपना है।

बहुत कम, बहुत बड़ी सेवाओं की तुलना में बहुत कम, बहुत छोटी सेवाएँ होना बेहतर है।


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

2
@ Nickdb93 - आपके मामले में, जैसा कि आपके सेंसर डेटा प्रकाशित कर रहे हैं, यह समझ में आ सकता है कि एक सेवा है, घटनाओं को सुनें और "व्यावसायिक घटनाओं" की एक नई धारा प्रकाशित करें, जैसे तापमानप्रशोल्ड। (जवाब में जोड़ा गया)
पीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.