2012-01-26 13 views
7

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

public interface IPositionMessage : IMessage 
{ 
    string UnitName { get; set; } 
    double Latitude { get; set; } 
    double Longitude { get; set; } 
} 

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

इसी तरह के question on the NServiceBus yahoo group में, अनुशंसित समाधान आम संदेश को कमांड में परिवर्तित करना और Bus.Publish के बजाय Bus.Send का उपयोग करना है। मुझे नहीं लगता कि इस परिदृश्य में वास्तव में क्या हो रहा है, यह एक घटना है (इकाई पहले से ही एक स्थिति में पहुंच चुकी है और नई स्थिति की रिपोर्ट कर रही है)। अगर मैं इसे कमांड में परिवर्तित करना चाहता हूं तो मुझे इस घटना के सभी संभावित ग्राहकों को पहले से ही जानना होगा, जो मैं नहीं करता हूं। एक और संभावित समाधान एकत्रीकरण/पुन: प्रकाशक बनाना होगा कि प्रत्येक सेवा बस होगी। आगे बढ़ें, और फिर संदेश को एक प्रकाशक से पुन: प्रकाशित किया जाएगा। यह एक अनावश्यक बाधा की तरह लगता है।

वहाँ ग्राहकों के लिए कई प्रकाशकों से एक ही संदेश की सदस्यता के लिए के लिए अनुमति देने के लिए कोई भी तरीका है?

+0

AFAIK, एक से अधिक भौतिक प्रकाशक से प्रकाशित करना बुरा व्यवहार है। –

+0

मेरे विचार में, प्रत्येक सेवा एक भौतिक नोड एक लॉजिकल प्रकाशक के हिस्से के रूप में भाग लेती है। यदि मेरा एक सेवा कार्यान्वयन था तो मेरा परिदृश्य अलग नहीं होगा और मुझे दूसरी मशीन पर इसे स्थापित करने के लिए स्केल करने की आवश्यकता है। – JadeMason

उत्तर

12

यह बातें उन एसओए "सफलता के गड्ढे" कि उदी यह बहुत मुश्किल आप से बचने के लिए के लिए बनाने की कोशिश करता है।

बुनियादी द्वंद्व यह है:

  • कमांड कई ग्राहकों द्वारा भेजा जाना चाहिए और प्राप्त एक भी आधिकारिक स्रोत से।
  • घटनाक्रम एक ही आधिकारिक स्रोत द्वारा प्रकाशित किया जाना चाहिए और कई ग्राहकों द्वारा प्राप्त किया जाना चाहिए।

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

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

महत्वपूर्ण यह है कि अपने सभी शारीरिक प्रोसेसर एक ही सदस्यता भंडारण साझा करना होगा है। वास्तव में, आप एक भौतिक endpoint संभाल केवल सदस्यता अनुरोध करना चाहते हैं और सभी में कोई प्रसंस्करण कर सकते हैं। यह सिर्फ सदस्यता अनुरोध प्राप्त करता है (QueueX @ ServerY IPositionMessage में रूचि रखता है) और सदस्यता संग्रहण अपडेट करता है।

फिर, एक ही सदस्यता भंडारण से जुड़ा प्रत्येक प्रोसेसर, IPositionMessage प्रकाशित करने के लिए जाता है और यह पता लगाएगा कि QueueX @ ServerY रुचि रखता है, और उस स्थान पर ईवेंट की एक प्रति भेजता है।

NServiceBus.Lite प्रोफ़ाइल के साथ एक देव वातावरण में निगलना थोड़ा मुश्किल होगा, क्योंकि सब्सक्रिप्शन स्टोरेज डिफ़ॉल्ट रूप से इन-मेमोरी है, इसलिए जाहिर है कि इसे साझा नहीं किया जाएगा और सही ढंग से चलाने के लिए प्रतीत नहीं होगा , तो इसके लिए तैयार रहो।

+0

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

+0

क्या इस तरह चीजों को कॉन्फ़िगर करने का एक उदाहरण है? मैं इस बारे में थोड़ा उलझन में हूं कि इस बारे में कैसे जाना है। –

+0

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

1

हालांकि एक से अधिक प्रकाशक की सदस्यता लेना संभव है (इसे <unicastBusConifg /> में कॉन्फ़िगर किया जा सकता है), मैं उपयोगकर्ता समूह से सहमत हूं कि यह एक प्रकाशन के बजाय तार्किक प्रेषण बनना चाहिए।

मैं काफी क्यों मुझे लगता है कि यह हालांकि पता नहीं है।

संबंधित मुद्दे