मैंने NServiceBus 6 में अपडेट किया है, जहां IProvideConfiguration<UnicastBusConfig> और इसके MessageEndpointMappings अप्रचलित हैं।

मैंने दस्तावेज़ीकरण में प्रकाशित/सदस्यता लेने के निर्देशों का पालन किया है। जैसा कि मैं इसे समझता हूं, अब किसी ईवेंट की सदस्यता लेते समय प्रकाशन समापन बिंदुओं को स्पष्ट रूप से नाम देना आवश्यक है।

इससे पहले, मैं ईवेंट इंटरफ़ेस निर्दिष्ट कर सकता था, समापन बिंदु ग्राहक का नाम होगा:

config.MessageEndpointMappings.Add(
                new MessageEndpointMapping
                {
                    AssemblyName = MyAssemblyName,
                    TypeFullName = typeof( IMyEvent ) ),
                    Endpoint = "SubscribingEndpoint"
                } );

अभी: यह चला जाता है और मेरे पास निम्नलिखित है। यह पूरी तरह से एक IProvideConfiguration वर्ग की आवश्यकता को प्रतिस्थापित करता है:

    var routing = endpointConfiguration.UseTransport<MsmqTransport>().Routing();
    endpointConfiguration.SendFailedMessagesTo( "error" );
    endpointConfiguration.AuditProcessedMessagesTo( "audit" );
    //register command
    routing.RouteToEndpoint( typeof( MyCommand), "SomeEndpoint" );
    //subscribe to event
    routing.RegisterPublisher(typeof(IMyEvent), "PublishingEndpoint" ); //?

तो यहां मुझे IMyEvent के प्रकाशक को निर्दिष्ट करना होगा, ग्राहक को नहीं। NSB5 में, यह आवश्यक नहीं था।

तो अगर इवेंट कई एंडपॉइंट्स द्वारा प्रकाशित किया जाता है तो मैं क्या करूँ?

1
John 16 जून 2017, 20:05
एक ईवेंट हमेशा केवल एक एंडपॉइंट से प्रकाशित होता था (नियम का पालन करते हुए केवल एक प्रकाशक होता है ...) और AFAIK हमेशा ऐसा होता था कि आपको ईवेंट के लिए प्रकाशक का पता प्रदान करने की आवश्यकता होती है ... आप क्या करने की कोशिश कर रहे हैं?
 – 
Sean Farmar
17 जून 2017, 18:41
मैं समझता/समझती हूं कि किसी ईवेंट को केवल एक एंडपॉइंट द्वारा प्रकाशित किया जाना चाहिए। NSB5 में, जैसा कि मैंने ऊपर दिखाया है, मैं एक सब्सक्राइबर सदस्यता लेता हूं, MessageEndpointMapping में अपने स्वयं के एंडपॉइंट नाम का उपयोग करके, न कि प्रकाशक के एंडपॉइंट नाम का। V5 प्रलेखन उतना ही कहता है। यह किसी ईवेंट VS कमांड प्रश्न की तुलना में कॉन्फ़िगरेशन समस्या प्रश्न से अधिक है। इस मामले में एक कमांड भेजना काम करेगा, सिवाय इसके कि इसके लिए रूटिंग सेट करना अधिक काम है।
 – 
John
17 जून 2017, 20:44
2
मैं उलझन में हूं, क्या आप यह बताते हुए लिंक प्रदान कर सकते हैं कि आप एंडपॉइंट के नाम का उपयोग कर सकते हैं न कि प्रकाशक के एंडपॉइंट नाम का? AFAIK यह हमेशा मामला था (और यह समझ में आता है) कि ग्राहक प्रकाशक को सदस्यता संदेश भेजेगा, इसलिए उसे कॉन्फ़िगरेशन में प्रकाशक के एंडपॉइंट नाम की आवश्यकता होगी ...
 – 
Sean Farmar
19 जून 2017, 12:10

1 उत्तर

सबसे बढ़िया उत्तर

तुम्हारे प्रश्न का उत्तर देने के लिए:

तो अगर इवेंट कई एंडपॉइंट्स द्वारा प्रकाशित किया जाता है तो मैं क्या करूँ?

आप अपने सब्सक्राइबर से कई RegisterPublisher कॉल प्राप्त करके एक से अधिक प्रकाशकों से एक ही ईवेंट की सदस्यता ले सकते हैं।

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

V5 और V6 के बीच परिवर्तन के संबंध में:

NSB5 में, जैसा कि मैंने ऊपर दिखाया है, मैं एक सब्सक्राइबर सदस्यता लेता हूं, MessageEndpointMapping में अपने स्वयं के एंडपॉइंट नाम का उपयोग करके, न कि प्रकाशक के एंडपॉइंट नाम का।

मुझे इस कथन का अनुसरण करने में कठिनाई हो रही है। V5 और V6 सदस्यता लेने के लिए समान दृष्टिकोण का उपयोग करते हैं, बस एक अलग सिंटैक्स।

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

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

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

  • आपके तार्किक समापन बिंदु समान सदस्यता संग्रहण साझा करते हैं, जिसके कारण ग्राहक समापन बिंदु को भेजा गया सदस्यता संदेश गलती से प्रकाशक को दिखाई दे सकता है।
  • प्रकाशक द्वारा उपयोग किए जाने वाले आपके स्थायी सदस्यता संग्रहण में पहले से ही ग्राहक की सदस्यता शामिल है। हालांकि यह अब सदस्यता संदेश प्राप्त नहीं कर सकता है (क्योंकि आपके कॉन्फ़िगरेशन के साथ यह नहीं होना चाहिए) इसमें अभी भी एक "पुरानी" सदस्यता है जिसका उपयोग प्रकाशक द्वारा किया जाता है।

इन कारणों में से कोई एक कारण आपके द्वारा देखे जाने वाले व्यवहार की व्याख्या कर सकता है या नहीं, NServiceBus के साथ MSMQ परिवहन का उपयोग करते समय, सदस्यता संदेश को प्रकाशक तक पहुंचने के लिए एक ग्राहक को हमेशा प्रकाशक के लिए एक मार्ग कॉन्फ़िगर करने की आवश्यकता होती है। यह डिज़ाइन V5 और V6 के बीच नहीं बदला।

विशेष दस्तावेज़ों पर उपलब्ध V5 और V6 दोनों में प्रकाशित/सदस्यता प्रदर्शित करने वाला एक अच्छा नमूना है: https://docs.particle.net/samples/pubsub/?version=core_5

मैंने NServiceBus 6 में अपडेट किया है, जहां IProvidConfiguration और इसके MessageEndpointMappings अप्रचलित हैं।

कृपया ध्यान दें, कि V6 में, ये दोनों API एक चेतावनी के साथ अप्रचलित हैं, लेकिन वे अभी भी काम करना जारी रखते हैं। इन एपीआई को अगले प्रमुख संस्करण में हटा दिया जाएगा।

मुझे उम्मीद है कि इससे चीजें थोड़ी साफ हो जाएंगी।

1
Sabacc 27 जून 2017, 10:26