जब एक बहुत से इनपुट डेटा की आवश्यकता होती है, तो एक माइक्रोसैके आर्किटेक्चर में एक नियम इंजन को कैसे फिट किया जाए?


12

वर्तमान स्थिति

हम एक ऑनलाइन शॉपिंग वेब एप्लिकेशन को एक माइक्रोसेक्चर आर्किटेक्चर में लागू कर रहे हैं (और अब बनाए हुए हैं)।

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

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

फिलहाल, हमारा shopping-cartमाइक्रोसर्विस यह सब डेटा अन्य माइक्रोसर्विसेज से इकट्ठा कर रहा है। भले ही इस डेटा का कुछ हिस्सा उपयोग किया जाता है shopping-cart, लेकिन ज्यादातर यह मुख्य रूप से नियम इंजन को खिलाने के लिए उपयोग किया जाता है।

नई आवश्यकताओं

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

जैसा कि जारी है, हम कई मुद्दों का सामना करेंगे:

  • हर किसी को (नियम इंजन को कॉल करना) डेटा के लाने को फिर से लागू करना होगा, भले ही उन्हें खुद के लिए इसकी आवश्यकता न हो;
  • नियम इंजन के अनुरोध जटिल हैं;
  • इस दिशा में जारी रखते हुए, हमें कई अनुरोधों के लिए नेटवर्क के चारों ओर इस डेटा को ट्रांसपोर्ट करना होगा।
  • shopping-cart सभी डेटा लाने के कारण बहुत बड़ा हो गया है;
  • मैं शायद बहुतों को भूल जाऊं…

इन परेशानियों से बचने के लिए हम क्या कर सकते हैं?

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

कुछ विचार

  1. बता दें कि नियम इंजन को उस डेटा की आवश्यकता होती है जो उसे चाहिए। यह एकल जिम्मेदारी सिद्धांत (और भी… ) का उल्लंघन करते हुए, इसमें और भी जटिलता जोड़ देगा ;
  2. डेटा लाने के लिए नियम इंजन से पहले एक प्रॉक्सी μ लागू करें;
  3. एक "डेटा भ्रूण" μs को लागू करें, जो नियम इंजन को एक बार (समग्र जांच) में आवश्यक सभी डेटा लाने के लिए कहता है।

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

3
उन परेशानियों से बचने के लिए आपका सबसे अच्छा शर्त नियम इंजन से छुटकारा पाना है।
whatsisname

@Andy नियम इंजन एक अलग माइक्रोसेवा है। इसका API थोड़ा सा अनुकूलित है shopping-cart, लेकिन हम अन्य माइक्रोसर्विस की जरूरतों के लिए इसे आसानी से अनुकूलित कर सकते हैं (वे अभी भी उपयोगकर्ताओं, उत्पादों और ऑर्डर से संबंधित हैं)। जैसा कि हम इसे देखते हैं, उन्हें उसी इनपुट डेटा की आवश्यकता होगी , विशेष रूप से जैसे व्यवसाय लागू करने के लिए विधेय चुनने में सक्षम है। सभी डेटा कार्ट सामग्री को छोड़कर अन्य माइक्रोसर्विसेज द्वारा प्रदान किया जाता है। डेटा प्राप्त करना प्रति से जटिल नहीं है, लेकिन यह तब जटिल हो जाता है जब आपको ~ 10 अन्य माइक्रोसर्विसेज को कॉल करना होता है और नियम इंजन द्वारा अपेक्षित संरचना को बनाए रखना होता है।
दीदीयर एल

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

जवाबों:


8

आइए एक दूसरे के लिए एक कदम पीछे ले जाएं और इस संभावना-से-उपन्यास-लंबाई के उत्तर को लिखने से पहले हमारे शुरुआती स्थान का आकलन करें। आपके पास:

  • एक बड़ा अखंड (नियम इंजन)
  • बड़ी मात्रा में गैर-मॉड्यूलर डेटा जो थोक में भेजा जाता है
  • नियम इंजन से डेटा प्राप्त करना कठिन है
  • आप नियम इंजन को हटा नहीं सकते

ठीक है, यह microservices के लिए बहुत अच्छा नहीं है। एक तुरंत चकाचौंध की समस्या है आप लोगों को यह गलतफहमी हो रही है कि माइक्रोसेवा क्या है।

हर किसी को (नियम इंजन को कॉल करना) डेटा के लाने को फिर से लागू करना होगा, भले ही उन्हें खुद के लिए इसकी आवश्यकता न हो;

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

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

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

आपके अधिकांश मुद्दे इसी से उपजे हैं।

नियम इंजन के अनुरोध जटिल हैं;

उन्हें कम जटिल बनाओ।

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

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

बेहतर अभी तक, आप कभी भी ऑनलाइन शॉपिंग टूल को लागू करने वाली पहली कंपनी नहीं हैं । अन्य कंपनियों पर शोध करें।

अब क्या...

इसके बाद, आपने कम से कम कुछ सबसे बड़े मुद्दों पर प्रतिक्रिया दी।

अगला अंक आपके नियम इंजन का यह प्रश्न है। मुझे उम्मीद है कि यह यथोचित रूप से स्टेटलेस है, जैसे कि आप इसे स्केल कर सकते हैं। यदि यह है, तो आप को कम से कम अपनाने के दौरान महिमा के एक विस्फोट में मरने या पागल workarounds बनाने के लिए नहीं जा रहे हैं।

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

इस बात पर विचार करते हुए कुछ समय बिताएं कि क्या आपके किसी भी माइक्रोसॉफ़्ट को वास्तव में आपके नियम इंजन में रखा जाना चाहिए। यदि आप एक "microservices आर्किटेक्चर" को प्राप्त करने के लिए अपने सिस्टम को बहुत ऊपर की ओर बढ़ा रहे हैं, तो आपको इसके लिए अधिक समय बिताने की आवश्यकता है।

वैकल्पिक रूप से, क्या आपके नियम इंजन को टुकड़ों में विभाजित किया जा सकता है? आपको लाभ मिल सकता है बस अपने नियम इंजन विशिष्ट सेवाओं के टुकड़े कर रहे हैं।

हमें यह भी सुनिश्चित करना चाहिए कि यह अड़चन न बने - उदाहरण के लिए कुछ डेटा लाने के लिए धीमा है (10s या उससे अधिक)

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

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

आपके द्वारा लाए जाने वाले डेटा के लिए एक डेटाबेस के साथ एक डिज़ाइन हो सकता है (यह क्या है, आपने इसका उल्लेख कई बार किया है), कुछ नियम इंजन, और आपके क्लाइंट (ओं) पर।

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

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


आपके उत्तर के लिए धन्यवाद, @enderland। वास्तव में माइक्रोसिस्टवर्क वास्तुकला अभी भी हमारे लिए अपेक्षाकृत नया है, इसलिए यह सवाल है। यह नियम इंजन हमें यहां तक ​​ले जाने के लिए थोड़ा व्यवस्थित रूप से विकसित हुआ है, इसलिए हमें इसे ठीक करने के लिए अब ड्राइविंग निर्देश की आवश्यकता है। यह (सौभाग्य से) पूरी तरह से स्टेटलेस है, इसलिए डेटा की मात्रा इसे इनपुट के रूप में लेती है। और इसे हम एक पुन: प्रयोज्य घटक बनाने के लिए पहले से निपटना चाहेंगे। लेकिन उपलब्ध उपलब्ध विधेय को कम किए बिना इनपुट डेटा की मात्रा कैसे कम करें? मुझे लगता है कि हमें एक एपीआई की आवश्यकता है जो डेटा को अपने दम पर लाने में सक्षम है, लेकिन इसे कैसे ठीक से आर्किटेक्चर करना है?
डिडिएर एल

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

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

1

नियम इंजन और इसके इनपुट और आउटपुट के बारे में प्रस्तुत जानकारी की मात्रा के साथ, मुझे लगता है कि आपका सुझाव नहीं। 2 सही रास्ते पर है।

नियम इंजन के वर्तमान उपभोक्ता एक अधिक विशेष उद्देश्य घटक के लिए आवश्यक जानकारी एकत्र करने की प्रक्रिया को आउटसोर्स कर सकते हैं।

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

नई आवश्यकता आगामी ग्राहकों और पिछले खरीद के आधार पर पिछले ग्राहकों को ई-मेल ऑफ़र के लिए इसी जानकारी का अधिक उपयोग करने की है। पिछली खरीद, इसमें वर्तमान और आगामी ऑफ़र कारक।

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

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


0

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

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


0

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

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