यह निर्धारित करने के लिए कि कोई संदेश कमांड संदेश या ईवेंट संदेश कैसे होना चाहिए?


11

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

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

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

जवाबों:


11

आज्ञाओं और घटनाओं के बीच एक सूक्ष्म, लेकिन महत्वपूर्ण अंतर है। एक आदेश में एक प्रतिक्रिया का अनुमान है जबकि एक घटना एक प्रतिक्रिया नहीं मानती है, यह केवल एक बयान है।

कम सार होना:

ShipOrderएक कमांड है और प्रेषक ShipOrderको किसी प्रकार की प्रतिक्रिया की संभावना होगी।
OrderShippedएक घोषणा है और प्रेषक एक प्रतिक्रिया की उम्मीद करने की संभावना नहीं है क्योंकि GoodJob!इस उदाहरण में एक बेकार प्रतिक्रिया है।

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

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

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


आप request for informationकार्यक्षमताओं को कैसे लागू करते हैं? ऐसा लगता है कि कुछ का उपयोग करना स्वाभाविक है, getUserInfo(uid)जो एक प्रतिक्रिया व्यक्त करने के लिए एक आदेश संदेश है। मुझे पता है कि कमांड संदेश युग्मन का परिचय देते हैं, लेकिन दुख की बात है कि इस मामले में, मैं यह नहीं देखता कि इसे घटना संदेशों के साथ कैसे लागू किया जाए। या इस तरह से कुछ अवसरों पर संदेश भेजने के लिए छड़ी करना ठीक है?
15:36 बजे du369

@ du369 क्षमा करें, लेकिन मैं आपके प्रश्न का अनुसरण नहीं कर रहा हूं। ऐसा लगता है कि आप एक कमांड बनाने की कोशिश कर रहे हैं लेकिन घटनाओं का उपयोग कर रहे हैं?

हाँ, बहुत ज्यादा है। में लिंक ली जवाब में प्रदान की, एक ही कार्यक्षमता दो अलग अलग तरीकों से लागू किया जाता है। एक CancelPolicyRequestसंदेश का उपयोग कर रहा है जो एक कमांड है। अन्य दृष्टिकोण दो घटना संदेशों का उपयोग करता है, अर्थात् InvoicePastDueNotificationऔर PolicyCancelledNotification। इसलिए मैं सोच रहा हूं कि क्या यह संभव है कि getUserInfo(uid)संदेश शैली की तरह आदेशों का पीछा करना संभव है और मैं ऐसा कैसे करने वाला हूं।
du369

1
@ du369 कुछ, कहीं न कहीं Actionकमांड के साथ जुड़ा हुआ है। एक कमांड से जुड़े दो चरण होते हैं। 1) क्या कमांड की जरूरत है (जैसे पॉलिसी समाप्त हो गई है), और 2) कमांड निष्पादित करें (उदाहरण के लिए पॉलिसी रद्द करें)। यदि Actorयह निर्धारित करता है कि कमांड की आवश्यकता है और निष्पादित कर सकता है, तो वह Actorईवेंट संदेश भेजने में सक्षम है। अन्यथा, जो कुछ भी निर्धारित करता है कि कमांड घटना को भेजने के लिए कमांड की आवश्यकता है।

5

एक ईवेंट संदेश कुछ ऐसा है जो अभी हुआ है। आप उस घटना की सूचना दे रहे हैं जो अभी हुई है।

एक कमांड संदेश एक संदेश है जो कुछ किए जाने की अपेक्षा करता है। यह एक प्रतिक्रिया की उम्मीद कर सकता है या नहीं।

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

बिल Poole सभी एक साथ आदेश संदेश से बचने का सुझाव देता है: http://bill-poole.blogspot.com.au/2008/04/avoid-command-messages.html

http://bill-poole.blogspot.com.au/


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

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

ली, धन्यवाद, यह उपयोगी है; वास्तव में, मेरा सुझाव है कि आप अपने उत्तर में अपनी टिप्पणी से सामग्री संपादित करें, जिसमें Poole लेखों का लिंक भी शामिल है (जो मुझे यकीन नहीं है कि मैंने पढ़ा है)।
काजार्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.