2010-09-01 14 views
5

मेरे पास एक निर्माता है कि मैं निरंतर हैशिंग द्वारा लगातार उपभोक्ताओं में काम वितरित करना चाहता हूं। उदाहरण के लिए, उपभोक्ता नोड्स एक्स और वाई के साथ, कार्य ए, बी, सी उपभोक्ता एक्स, और डी, ई, एफ उपभोक्ता वाई के लिए हमेशा जाना चाहिए। लेकिन यदि ज़ेड उपभोक्ताओं के पूल में शामिल हो जाता है तो यह थोड़ा सा स्थानांतरित हो सकता है।उत्पादक कतार एक संदेश कतार के माध्यम से लगातार उपभोक्ताओं के लिए हैशिंग?

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

एक समस्या जो मैं चल रहा हूं वह इन कतारों को सूचीबद्ध कर रही है, क्योंकि निर्माता को काम से पहले सभी उपलब्ध कतारों को जानना आवश्यक है। एएमक्यूपी लिस्टिंग कतारों का भी समर्थन नहीं करता है, जो मुझे अपने पूरे दृष्टिकोण से अनिश्चित बनाता है। खरगोश एमक्यू और एलिस (brokenly at the moment) उस कार्यक्षमता को जोड़ें हालांकि: Is there an API for listing queues and exchanges on RabbitMQ?

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

+1

उत्सुकता से, आप काम को विभाजित करते समय स्थिरता के बारे में इतना क्यों ख्याल रखते हैं? जैसा कि आप कहते हैं, जब उपभोक्ताओं को जोड़ा या हटा दिया जाता है तो मानचित्रण बदल जाएगा। – scvalex

+1

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

उत्तर

6

आप जो वर्णन करते हैं वह RabbitMQ में सक्षम है।

आपका सेटअप होगा कुछ की तरह:

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

इसलिए, यदि आप 6 कार्य प्रकार है: ए, बी, सी, डी, ई, एफ, और केवल दो उपभोक्ताओं C1 और C2, अपने बाइंडिंग लगेगा जैसे: सी 1 बाध्य 3 बार रूटिंग कुंजियों वाले consistent_divider को ए, बी और सी; सी 2 बाउंडिंग कुंजी के साथ 3 गुना सी_ डी बाध्य करने के लिए डी, ई और एफ

जब सी 3 पूल में शामिल होता है, तो निर्माता इसे देखता है और तदनुसार कतारों को पुनर्निर्मित करता है।

जब निर्माता प्रकाशित होता है, तो यह रूटिंग_की ए, बी, सी, डी, ई और/या एफ के साथ संदेश भेजता है, और संदेश सही कतारों में भेजे जाएंगे।

इस के साथ दो संभावित समस्याओं होगा:

  1. वहाँ जब उपभोक्ता पूल जुड़ जाता है और संदेशों इसे करने के लिए कराई पाने के बीच एक मामूली अंतराल है, अगर, कतार में पहले से ही संदेश हैं, तो उपभोक्ता के लिए किसी अन्य उपभोक्ता के लिए संदेश प्राप्त करना संभव है (उदाहरण के लिए सी 3 जुड़ता है, उत्पादक rebinds, लेकिन सी 2 अभी भी कुछ ई और एफ संदेश प्राप्त करता है क्योंकि वे पहले से ही अपनी कतार में थे),
  2. यदि कोई उपभोक्ता किसी भी कारण से मर जाता है, तो इसकी कतार में संदेश (और इसकी कतार में मार्ग) खो जाएगा; इसे क्रमशः संदेशों को पुन: प्रकाशित और मृत-पत्रित करके हल किया जा सकता है।

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

+0

बहुत गहन, उत्साहजनक उत्तर! एक सवाल। आप कहते हैं कि उपभोक्ता खुद को बांध नहीं सकते हैं। क्या यह उपभोक्ताओं से अलग है जो अपने कतार नाम के बराबर रूटिंग कुंजी के साथ बाध्यकारी है? फिर list_consumers के बजाय मैं सीधे list_queues, कोई और बाध्यकारी की आवश्यकता नहीं है। – Bluu

+1

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

+0

अच्छा विचार, क्या यह पुन: बाध्य होने पर संदेश खो जाएगा? – flycee

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