2012-01-24 19 views
7

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

समस्या यह है कि मेरे पास कई उपभोक्ता हैं और मैं नहीं चाहता हूं कि वे एक ही कतार में प्रतिस्पर्धा करें। क्या कतार पर लॉक की गारंटी देने का कोई तरीका है? यदि नहीं, तो क्या मैं कम से कम यह सुनिश्चित कर सकता हूं कि यदि 2 उपभोक्ता एक ही कतार से जुड़े हैं तो वे एक ही संदेश नहीं पढ़ते हैं? लेन-देन मुझे कुछ हद तक मदद कर सकता है लेकिन मैंने बात सुनी है कि वे खरगोश एमक्यू से हटा दिए जाएंगे।

अन्य वास्तुशिल्प सुझावों का भी स्वागत है।

धन्यवाद!

संपादित करें: टिप्पणी में बताया गया है कि मुझे संदेशों को संसाधित करने की आवश्यकता में एक विशिष्टता है। वे केवल समूहों में समझ में आते हैं और एक उच्च संभावना है कि संबंधित संदेश एक कतार में एक साथ चिपके हुए हैं। उदाहरण के लिए यदि मैं 100 संदेशों का बैच खींचता हूं, तो एक उच्च संभावना है कि मैं संदेश 1-3, 4-5,6-10 आदि के साथ कुछ करने में सक्षम हूं। अगर मैं कुछ संदेशों के लिए समूह ढूंढने में विफल रहता हूं I उन्हें कतार में पुनः सबमिट कर देगा। WorkQueue काम नहीं करेगा क्योंकि यह एक ही समूह से संदेशों को कई श्रमिकों तक फैलाएगा जो नहीं जानते कि उनके साथ क्या किया जाए।

+0

जाहिर उपभोक्ताओं की तरह कुछ का उपयोग कर आपस में सिंक कर सकते हैं [बातुनी] (http://en.wikipedia.org/wiki/Gossip_protocol) मामले में यह संभव नहीं है, लेकिन मैं उत्सुक था ... –

उत्तर

6

क्या आपने Enterprise Integration Patterns पर इस मुफ्त ऑनलाइन पुस्तक को देखा है?

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

यदि आपके पास संदेश प्रारूप पर नियंत्रण है, तो आप दो तरीकों से बैचिंग को पूरी तरह से करने के लिए RabbitMQ प्राप्त करने में सक्षम हो सकते हैं। एक विषय विनिमय के साथ, आप यह सुनिश्चित कर सकते हैं कि प्रत्येक संदेश पर रूटिंग कुंजी प्रारूप का है। Batchid.something और फिर एक कार्यकर्ता जो बैच xxyzz के अस्तित्व के बारे में सीखता है, बाध्यकारी कुंजी का उपयोग करेगा जैसे # .xxyzz। # केवल उन संदेशों का उपभोग करें। कोई पुन: प्रकाशित करने की आवश्यकता नहीं है।

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

हालांकि मैं पुस्तक की जांच करने की सिफारिश करता हूं, क्योंकि यह सामान्य कार्यकर्ता कतार अवधारणा की तुलना में मैसेजिंग आर्किटेक्चर का बेहतर अवलोकन देता है जो अधिकांश लोग शुरू करते हैं।

+0

यह आवाज सिर्फ वही है जो मैं चाहता हूं। Thans! –

+0

आपको बैचों में संदेशों को खींचने के लिए चैनल पर prefetch.count का उपयोग करने पर विचार करना चाहिए। http://www.rabbitmq.com/consumer-prefetch.html –

2

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

यह बॉक्स के बाहर उपयोग करने के लिए तैयार है। RabbitMQ दस्तावेज़ों में इसे Work Queue मॉडल कहा जाता है। एक कतार, एकाधिक उपभोक्ता, जिनमें से कोई भी कुछ साझा नहीं कर रहा है। ऐसा लगता है कि आपको क्या चाहिए।

+0

दुर्भाग्य से किसी विशेषता के कारण मुझे संदेशों को संसाधित करने की आवश्यकता है। वे केवल समूहों में समझ में आते हैं और एक उच्च संभावना है कि संबंधित संदेश एक कतार में एक साथ चिपके हुए हैं। उदाहरण के लिए यदि मैं 100 संदेशों का बैच खींचता हूं, तो एक उच्च संभावना है कि मैं संदेश 1-3, 4-5,6-10 आदि के साथ कुछ करने में सक्षम हूं। अगर मैं कुछ संदेशों के लिए समूह ढूंढने में विफल रहता हूं I उन्हें कतार में पुनः सबमिट कर देगा। WorkQueue काम नहीं करेगा क्योंकि यह एक ही समूह से संदेशों को कई श्रमिकों तक फैलाएगा जो नहीं जानते कि उनके साथ क्या किया जाए। –

+0

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

+0

आप सही हैं। मैंने ऊपर की आवश्यकता की ओर इशारा किया। आपके प्रश्न के बारे में, मैं निर्माता के पक्ष में उन्हें पकड़ने में सक्षम होना पसंद करूंगा, लेकिन समूह में प्रत्येक संदेश अलग-अलग मशीनों पर रहने वाले विभिन्न उत्पादकों के माध्यम से आ सकता है। –

0

बैच में संदेशों का उपभोग करने के लिए आप एक चैनल/उपभोक्ता स्तर प्रीफ़ेच गिनती सेट कर सकते हैं। संदेशों को पुनः सबमिट करने के लिए, आपको basic.reject AMQP विधि का उपयोग करना चाहिए और उन संदेशों को मृत पत्र कतार में अपेक्षित या अग्रेषित करने के लिए चुना जा सकता है। एक ही कतार से संदेशों को खींचने की कोशिश कर रहे कई उपभोक्ता एक समस्या नहीं है अस्थिर AMQP basic.get विधि समवर्ती उपभोक्ताओं को संभालने के लिए सिंक्रनाइज़ किया जाएगा।

https://groups.google.com/forum/#!topic/rabbitmq-users/hJ8f5du-GCA

+0

http://www.rabbitmq.com/consumer-prefetch.html –

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