माइक्रोसर्विसेस और स्टोर की गई प्रक्रियाएँ


34

क्या संग्रहीत प्रक्रियाओं को एक माइक्रोसैस आर्किटेक्चर में बुरा अभ्यास माना जाता है?

यहाँ मेरे विचार हैं:

  • microservices पर अधिकांश किताबें प्रति microservice एक डेटाबेस की सलाह देते हैं। संग्रहीत प्रक्रियाएं आमतौर पर एक अखंड डेटाबेस पर काम करती हैं।

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

  • अधिकांश माइक्रोसॉर्फ़ आर्किटेक्चर पुस्तकें (जो मैंने पढ़ी हैं) अनुशंसा करती हैं कि माइक्रोसेवा व्यवसाय उन्मुख ( डोमेन-संचालित डिज़ाइन (DDD) का उपयोग करके डिज़ाइन किया जाना चाहिए )। डेटाबेस में संग्रहीत कार्यविधियों में व्यावसायिक तर्क को स्थानांतरित करके यह अब ऐसा नहीं है।

इस पर कोई विचार?


10
@ RandomUs1r क्षमा करें, इससे मुझे कोई मतलब नहीं है। DB संरचना को गैर-संबंधपरक क्यों होना पड़ता है? निश्चित रूप से, इसके बाहरी संदर्भ हो सकते हैं, लेकिन इसकी आंतरिक संरचना 100% रिलेशनल हो सकती है
IMIL

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

3
आपके डेटाबेस का आपके डेटा डिज़ाइन और कार्यान्वयन के साथ कितना अखंड है, इसका संग्रहीत प्रक्रियाओं का उपयोग करने या न करने से कोई लेना-देना नहीं है।
RBarryYoung

5
"संग्रहीत प्रक्रियाएं आमतौर पर एक मोनोलिथ डेटाबेस पर काम करती हैं।" आपको किसी भी स्रोत से मिलने वाली किसी भी जानकारी या सलाह को छोड़ने के बारे में दृढ़ता से विचार करना चाहिए जो आपके साथ उस "तथ्य" को साझा करता है।
स्टिंगजैक

3
@ RandomUs1r उम्म नहीं, केवल एक चीज जिसे आप वास्तव में खो देते हैं, वह है कि आप संदर्भ कुंजी पर विदेशी कुंजी बाधाओं का उपयोग नहीं कर सकते हैं - जो कि माइक्रोसेवा की बात है। एक विचार के लिए कि NoSql डेटाबेस किसी भी तरह से जादुई रूप से तेजी से बार-बार अस्वीकृत हो गया है, लेकिन भले ही वे तेज थे (वे नहीं हैं), आपको सभी मौजूदा बुनियादी ढांचे, ज्ञान और मुफ्त के लिए मौजूदा कोड भी मिलता है - जो बहुत बड़ा है । सर्न और कई अन्य केवल संबंधपरक डेटाबेस का उपयोग करके डेटा के टेराबाइट्स का प्रबंधन करते हैं। NoSql डेटाबेस का उपयोग उनके पास है, लेकिन वे स्वतंत्र हैं कि क्या आप माइक्रोसिस्टम का उपयोग करते हैं या नहीं।
वू

जवाबों:


45

कुछ भी नहीं है जो स्पष्ट रूप से माइक्रोसर्विस के साथ संग्रहीत प्रक्रियाओं का उपयोग करने के खिलाफ मना या बहस करता है।

डिस्क्लेमर: मुझे किसी डेवलपर के POV से संग्रहित प्रक्रियाएं पसंद नहीं हैं, लेकिन यह किसी भी तरह से माइक्रोसेवा से संबंधित नहीं है।

संग्रहीत प्रक्रियाएं आमतौर पर एक मोनोलिथ डेटाबेस पर काम करती हैं।

मुझे लगता है कि आप एक तार्किक गिरावट के आगे झुक रहे हैं।

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

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

microservices पर अधिकांश किताबें प्रति microservice एक डेटाबेस की सलाह देते हैं।

इन छोटे डेटाबेसों में संग्रहीत कार्यविधियाँ नहीं हो सकती हैं, इसका कोई तकनीकी कारण नहीं है।

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

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

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

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

अधिकांश msa पुस्तकें (जो मैंने पढ़ी हैं) यह सलाह देती हैं कि माइक्रोसॉफ़्ट को व्यवसाय उन्मुख (डीडीडी का उपयोग करके डिज़ाइन किया गया) होना चाहिए। डेटाबेस में संग्रहीत कार्यविधियों में व्यावसायिक तर्क को स्थानांतरित करके यह अब ऐसा नहीं है।

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

लेकिन फिर भी, कि आप microservices का उपयोग करें या नहीं की परवाह किए बिना मौजूद है। एकमात्र कारण यह एक बड़े मुद्दे की तरह लग रहा है, क्योंकि माइक्रोसिस्टर्स आपको अपनी पूरी वास्तुकला को आधुनिक बनाने के लिए धक्का देते हैं, और स्प्रोक्स आधुनिक वास्तुकला में अब और पसंदीदा नहीं हैं।


4
मुझे यकीन नहीं है कि अगर यह कहना सही है कि माइक्रोसॉफ़्ट आपको अपनी पूरी वास्तुकला को आधुनिक बनाने के लिए धक्का दे रहा है। अधिक बार नहीं, वे खराब नियोजित कोड की गड़बड़ी की वजह से पतली परत पर होते हैं। अच्छी तरह से किए जाने पर वे बहुत अच्छे हो सकते हैं, लेकिन वे वास्तव में आपको किसी भी अन्य वास्तुकला की तुलना में बेहतर कोडिंग की ओर किसी भी तरह से धक्का नहीं देते हैं। फिर भी, अच्छा जवाब। आपको मुझसे +1 मिला।
टी। सर -

11
@ T.Sar आधुनिक उतना बेहतर नहीं है। रिफैक्टरिंग (माइक्रोसर्विसेज या जो भी हो) का अर्थ है बदलाव। परिवर्तन आपको अपने वर्तमान विचारों का उपयोग करने के लिए मजबूर करता है। हमें उम्मीद है कि वे बेहतर विचार हैं।
कैंडिड_ऑरेंज

2
@ T.Sar: भाड़े कालातीत होते हैं, और आप आमतौर पर किसी भी प्रणाली (आधुनिक या नहीं) का दुरुपयोग कर सकते हैं कुछ ऐसा करने के लिए जो तकनीकी रूप से संभाल सकता है लेकिन कभी भी इसके लिए इरादा नहीं था। माइक्रोसर्विसेज़ आपको इसे अलग तरीके से करने का आग्रह करता है (और इस तरह कुछ पुराने दृष्टिकोणों का पुनर्मूल्यांकन करता है) लेकिन वे इसे सार्वभौमिक रूप से लागू नहीं कर सकते । सार्वभौमिक प्रवर्तन के साथ आप आमतौर पर संगतता / मान्य फ्रिंज केस विभाग में पीड़ित होते हैं।
Flater

4
@candied_orange "आधुनिक उतना बेहतर नहीं है" - मुझे लगता है कि मैं तहे दिल से उससे सहमत हूं। बहुत अच्छी बात है।
टी। सर -

3
आधुनिक "पर्याप्त" का पर्यायवाची भी नहीं है।
Laiv

24

सॉफ्टवेयर लिखने के लिए यह आवश्यक है कि आप एक तकनीक के साथ जोड़े को कसकर बांधें।

प्रोग्रामिंग भाषा द्वारा प्रदान किए जा रहे रनटाइम वातावरण में बहुत कम से कम भीतर विकसित किया जा रहा है।

आम तौर पर यद्यपि आप पाएंगे कि आपकी सूक्ष्म सेवा कई तकनीकों से कसकर जुड़ी हुई है:

  • उच्च स्तरीय HTTP / SSL / SOAP प्रोटोकॉल कार्यान्वयन प्रदान करने के लिए नेटवर्क सेवा फ्रेमवर्क
  • दृढ़ता प्रदान करने के लिए रिपोजिटरी / ओआरएम / डीएओ फ्रेमवर्क।
  • डेटा हेरफेर फ्रेमवर्क डेटा के साथ काम करने के लिए उपकरण प्रदान करने के लिए।
  • मल्टी-टास्किंग, फाइल सिस्टम, मेमोरी, जीपीयू कंप्यूट, एक्सपेंशन कार्ड आदि जैसे ओएस संसाधनों तक पहुंच प्रदान करने के लिए प्रोसेस / थ्रेडिंग / ओएस फ्रेमवर्क ...

और वह है नंगे हड्डियों की सूक्ष्म सेवा करना।

संग्रहित प्रक्रियाएं

एक संग्रहीत प्रक्रिया बस एक और तकनीक है जिसे आप उपयोग या उपयोग नहीं करना चुन सकते हैं। यह जादुई रूप से आपके कोड को अखंड या सूक्ष्म नहीं बनाता है।

हालांकि यह क्या है:

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

इनमें से प्रत्येक एक वास्तविक लागत है। कुछ मामलों में लागत उचित है, दूसरों में यह नहीं है।

आप एक स्क्रिप्टिंग इंजन की मेजबानी करके लगभग समान लागत का भुगतान कर रहे होंगे। एकमात्र कमी यह है कि आप मेजबान भाषा के समान प्रोग्रामिंग प्रतिमान चुन सकते हैं।

व्यापार का तर्क

डेटाबेस में व्यावसायिक नियमों को स्थानांतरित करना बुरा व्यवहार है। सिर्फ संग्रहीत प्रक्रियाओं के कारण नहीं।

यह एक बुरा अभ्यास है, क्योंकि डेटाबेस और व्यावसायिक तर्क विभिन्न बाल काटना स्तरों पर काम करते हैं।

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

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

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

तालिका स्कीमा निर्दिष्ट करने का मात्र कार्य डेटाबेस में व्यावसायिक तर्क को स्थानांतरित कर रहा है।

आर्किटेक्चर

आप उचित समस्या के लिए उचित उपकरण का उपयोग कर, बहुत अधिक उपकरणों की आवश्यकता के बिना, और न ही इसे हल करने के लिए, इसे हल करने के लिए बहुत कठिन बना रहे हैं।

यह आसान नहीं है।

लेकिन आइए बिना सोचे समझे, आप कई भाषाओं में वितरित व्यावसायिक तर्क को कैसे बनाए रखेंगे?

  • एक कैटलॉग ... ताकि प्रत्येक व्यावसायिक नियम कार्यान्वयन को ट्रैक और रखरखाव किया जा सके।
  • टेस्ट ... इसका उपयोग प्रत्येक व्यावसायिक नियम के विरुद्ध किया जा सकता है, भले ही इसे कहाँ और कैसे लागू किया गया हो।
  • एक संदर्भ कार्यान्वयन .. ताकि जब विसंगतियां मिलें, तो सत्य का स्रोत मौजूद हो (या कम से कम बहस का स्रोत)।

लेकिन इसकी एक लागत भी है।

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

8

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

तो संक्षिप्त जवाब है, नहीं, संग्रहीत कार्यविधियाँ एक microservice वास्तुकला में स्वाभाविक रूप से खराब नहीं हैं। लेकिन आपको समझने की आवश्यकता है:

  1. आप भंडारण इंजन के प्रतिस्थापन में बाधाएं जोड़ रहे हैं। यदि कुछ परिचालन या प्रदर्शन विशेषताओं या सुविधा सीमाओं के लिए आपको स्टोरेज इंजन को स्विच करने की आवश्यकता होती है, तो लागत अधिक होगी क्योंकि आप बहुत सारे नए कोड लिख और परीक्षण करेंगे। एक से अधिक स्टोरेज इंजन (या तो माइग्रेशन चरण के दौरान या प्रदर्शन की जरूरतों के आधार पर गतिविधियों को अलग करने के लिए) चलाने से निरंतरता की समस्या हो सकती है जब तक कि आप दो-चरण कमिट (2PC) का उपयोग नहीं करते हैं, जिसमें प्रदर्शन समस्याएँ हैं।
  2. आपको बनाए रखने के लिए एक और एपीआई मिला है, जिसका अर्थ है कि आपकी निर्भरता टूट सकती है। प्रक्रियाओं पर मापदंडों के प्रकारों को जोड़ना, हटाना या बदलना मौजूदा कोड को तोड़ सकते हैं। टेबल और प्रश्नों के साथ भी यही बात होती है, लेकिन आपके उपकरण कम ट्रैकिंग के साथ मददगार हो सकते हैं जहां चीजें गलत हो सकती हैं। संग्रहीत प्रक्रियाओं के साथ समस्याएं आम तौर पर रनटाइम पर पाई जाती हैं, जो विकसित / तैनाती प्रक्रिया में बहुत देर से होती हैं।
  3. आपकी डेटाबेस अनुमतियां अभी और जटिल हो गई हैं। क्या एक प्रक्रिया उपयोगकर्ता के रूप में या कुछ अन्य भूमिका के रूप में चलती है? आपको इसके बारे में सोचने की ज़रूरत है, और इसे प्रबंधित करें (उम्मीद है कि स्वचालित रूप से।)
  4. आपको नए संस्करणों को सुरक्षित रूप से स्थानांतरित करने में सक्षम होने की आवश्यकता है। अक्सर एक प्रक्रिया को छोड़ दिया जाना चाहिए और फिर से बनाया जाना चाहिए। एक बार फिर, अनुमतियाँ आपके लिए कुछ समस्याएं पैदा कर सकती हैं।
  5. एक असफल प्रवास का रोलबैक का मतलब अतिरिक्त प्रयास हो सकता है। जब उत्पादन वातावरण डेवलपर्स से अलग हो जाता है, तो चीजें और भी चुनौतीपूर्ण हो जाती हैं।

ये संग्रहीत प्रक्रियाओं के कुछ उपयोग हैं जो मुझे लगता है कि अक्सर सार्थक होते हैं:

  1. संपादन इतिहास का प्रवर्तन (ऑडिट लॉग)। ट्रिगर आमतौर पर इस उद्देश्य के लिए उपयोग किए जाते हैं, और ट्रिगर संग्रहीत कार्यविधियाँ हैं। कुछ डेटाबेस में आवेषण और अपडेट को पूरी तरह से एप्लिकेशन भूमिका के लिए अस्वीकार करना भी संभव है: क्लाइंट उन प्रक्रियाओं को निष्पादित करते हैं जो उचित अनुमतियों के साथ एक अलग भूमिका के रूप में चलाए जाते हैं और जो सभी आवश्यक व्यवहार को लागू करते हैं।
  2. चेक बाधाओं का विस्तार। यह आपको व्यावसायिक तर्क क्षेत्र में मिल सकता है, लेकिन ऐसे मामले हैं जहां डेटाबेस की अंतर्निहित बाधा उपकरण आपके लिए आवश्यक नहीं हो सकते हैं। अक्सर चेक को व्यक्त करने का सबसे अच्छा तरीका अनिवार्य कोड के साथ होता है, और यदि आप इसे करने के लिए अपने आवेदन पर निर्भर करते हैं तो आप खराब डेटा देने का जोखिम उठाते हैं।
  3. किसी दृश्य के अनुपयुक्त या बहुत जटिल होने पर जटिल प्रश्नों का एनकैप्सुलेशन। मैंने कुछ मामलों को देखा है जहां एक सही दृश्य के लिए कुछ अत्यंत जटिल एसक्यूएल की आवश्यकता होती है जिसे संग्रहीत प्रक्रिया में बहुत अधिक समझदारी से व्यक्त किया जा सकता है। यह शायद दुर्लभ है, लेकिन ऐसा होता है।

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

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


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

@Falco मुझे लगता है कि यदि आप JPA का विशेष रूप से उपयोग कर रहे हैं तो डेटाबेस को बदलना बहुत मुश्किल नहीं होना चाहिए। प्रदर्शन निश्चित रूप से काफी भिन्न हो सकते हैं और हमेशा परीक्षण करने की आवश्यकता होती है। एक जोड़ी सेवाएँ जो मैं बनाए रखता हूं "सूक्ष्म" इस अर्थ में नहीं है कि वे लाखों या अरबों से अधिक डेटा बिंदुओं को स्कैन या एग्रीगेट कर सकते हैं और मनमाने ढंग से बड़े (अक्सर पृष्ठांकित) डेटा सेट लौटा सकते हैं। मैं उनके लिए जेपीए का उपयोग करने की कल्पना नहीं कर सकता, लेकिन मैं एक ही एपीआई को बनाए रखते हुए अंतर्निहित डेटाबेस इंजन (और SQL को फिर से लिखना) को बदलने की कल्पना कर सकता हूं।
15

4

भंडारण की प्रक्रिया कार्यान्वयन विवरण हैं। डेटाबेस फ़ंक्शंस, लैम्ब्डा या एक शेल स्क्रिप्ट जो फ़ाइल सिस्टम में कहीं संग्रहीत है, वास्तुकला के लिए सभी कार्यान्वयन विवरण और अप्रासंगिक हैं।

microservices पर अधिकांश किताबें प्रति microservice एक डेटाबेस की सलाह देते हैं।

ठीक है, इसलिए हम इन डेटाबेस में संग्रहीत प्रक्रियाओं को कोड कर सकते हैं।

फिर से अधिकांश माइक्रोसिस्ट आर्किटेक्चर बुक्स बताती हैं कि उन्हें स्वायत्त और शिथिल युग्मित होना चाहिए

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

ध्यान दें कि "स्प्लिट" पहले से ही डिकॉउलिंग एजेंट की तरह काम करता है। मान लें कि हमारी दो सेवाएँ हैं, A ओरेकल और B द्वारा MongoDB द्वारा समर्थित है। यदि हम डिकॉउलिंग के सुनहरे नियम को नहीं तोड़ते हैं, तो बी पर नगण्य दुष्प्रभाव के साथ ए + ओरेकल को गिराना संभव है।

लिखित रूप में संग्रहीत प्रक्रियाओं का उपयोग करते हुए, विशेष रूप से ओरेकल में कहते हैं, कसकर जोड़े को उस तकनीक के लिए microservice।

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

यद्यपि, यदि हमारी सेवाएं पर्याप्त रूप से सूक्ष्म हैं, तो विक्रेता लॉक-इन अब एक समस्या नहीं है क्योंकि यह पूरे के एक छोटे हिस्से को प्रभावित करता है। एक छोटा हिस्सा जिसे जल्दी से प्रतिस्थापित (या पृथक) करना संभव है।

अधिकांश MSA पुस्तकें (जो मैंने पढ़ी हैं) अनुशंसा करती हैं कि माइक्रोसोर्सेज को व्यवसाय उन्मुख (DDD का उपयोग करके डिज़ाइन किया गया) होना चाहिए।

यह व्यवसाय-चालित होना चाहिए और यहाँ बात। सभी व्यवसाय DDD का लाभ नहीं उठाते हैं। DDD और microservices कई बिंदुओं में ओवरलैप करते हैं, लेकिन वे कारण-प्रभाव नहीं होते हैं। हम anemic सेवाओं से बना एक microservices पारिस्थितिकी तंत्र के साथ समाप्त हो सकता है। या दोनों के मिश्रण से बना है: एक जटिल डोमेन को लागू करने वाली सेवाएं और सीधे DB से POJOs प्रदान करने वाली एनीमिक सेवाएं। इसमें कुछ भी गलत नहीं है।

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

हमेशा ध्यान रखें कि कोई भी वास्तुकला एक अंत का साधन है। व्यापार नियम। हम फैशन के लिए या कला के प्रति प्रेम के लिए माइक्रोसिस्टम्स इकोसिस्टम का निर्माण नहीं करते हैं।


1

यह वास्तव में microservices के साथ कुछ नहीं करना है।

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

आर्किटेक्चर जैसी समस्याएं बहुत हैं। सबसे महत्वपूर्ण बात यह है कि यह अधिकांश तर्क को इकाई परीक्षण के लिए बहुत कठिन बनाता है। ये आर्किटेक्चर अब पक्ष में नहीं हैं।

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

माइक्रोसर्विस के साथ संबंध सिर्फ इतना है कि माइक्रोसोर्सेज नए और आरोही हैं - हम अब मोनोलिथ नहीं करते हैं - और ये कि नई आर्किटेक्चरल स्टाइल भी आरोही हैं - हम अब फ्लैट लेयर्स नहीं करते हैं।

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