2014-06-18 11 views
6

मैं हाल ही में सेलेरी के साथ काम कर रहा हूं और मुझे यह पसंद नहीं है। यह विन्यास गन्दा, जटिल और खराब दस्तावेज है।सेलेरी प्रसारण बनाम RabbitMQ fanout

मैं एक निर्माता से सेलेरी के साथ कई उपभोक्ताओं तक प्रसारण संदेश भेजना चाहता हूं। मुझे क्या भ्रमित करता है Celery शर्तों और अंतर्निहित परिवहन RabbitMQ के बीच विसंगति है।

RabbitMQ में आप एक एकल fanout Exchange और अधिक संदेशों का प्रसारण करने के कतार हो सकता है:

enter image description here

लेकिन अजवाइन में शर्तों सब अव्यवस्थित हैं: यहाँ आप एक broadcast Queue, जो कई के लिए संदेश भेजता है हो सकता है उपभोक्ताओं:

enter image description here

मैं भी समझ में नहीं आता, कैसे अजवाइन प्रसारण कतार बिल्कुल काम माना जाता है, कारण कई उपभोक्ताओं के साथ RabbitMQ कतार लोड संतुलन के लिए हैं। तो RabbitMQ में यदि एकाधिक उपभोक्ता (यानी उपभोक्ताओं का एक पूल) एक ही कतार से जुड़े होते हैं, तो केवल एक उपभोक्ता संदेश प्राप्त करेगा और संसाधित करेगा, which is called round robin in RabbitMQ docs

इसके अलावा, प्रसारण पर सेलेरी दस्तावेज वास्तव में अपर्याप्त है। ब्रॉडकास्ट कतार, fanout या नहीं के लिए मैं किस प्रकार के RabbitMQ एक्सचेंज निर्दिष्ट करना चाहिए? क्या आप एक पूर्ण उदाहरण दे सकते हैं?

तो, मैं जो पूछ रहा हूं वह है (1) सेलरी में ब्रॉडकास्ट कतारों की अवधारणा और कार्यान्वयन की स्पष्टीकरण और (2) ब्रॉडकास्ट कतार कॉन्फ़िगरेशन का एक संपूर्ण उदाहरण है। धन्यवाद।

+1

क्या इससे मदद मिलती है? http://celery.readthedocs.org/en/latest/userguide/routing.html#exchanges-queues-and-routing-keys ऐसा लगता है कि सेलेरी में 'कतार' परिभाषा में एक्सचेंज शामिल है, इसलिए संभवतः आप एक सेलेरी कतार को परिभाषित कर सकते हैं एक fanout एक्सचेंज के शीर्ष पर जो कई RabbitMQ कतारों का अंतर्निहित कार्यान्वयन होगा। इस मामले में मुझे लगता है कि आप सेलेरी कॉन्फ़िगरेशन में 'प्रसारण' कतार नहीं चाहते हैं, जब तक कि आप वास्तव में एक ही कार्य को प्रसंस्करण करने वाले एकाधिक श्रमिकों को – Anentropic

+0

@ एंट्रोपिक उत्तर के लिए धन्यवाद, मैं उस पृष्ठ का व्यापक रूप से उपयोग कर रहा हूं, लेकिन जैसा कि आप देख सकते हैं, ब्रॉडकास्ट कतार की परिभाषा 'CELERY_QUEUES = (प्रसारण (' प्रसारण_टास्क ') है,)' और यह सामान्य 'CELERY_QUEUES = (कतार (नाम, विनिमय, रूटिंग_की) के विपरीत एक्सचेंज निर्दिष्ट नहीं करता है,) उदाहरणों में, आपने इंगित किया। मैं एपीआई संदर्भ में 'प्रसारण' की तलाश में हूं, लेकिन इसे नहीं मिला। –

+0

जो मैं कह रहा था वह है: मुझे नहीं लगता कि आप प्रसारण कतार का उपयोग करना चाहते हैं। मुझे लगता है कि आप 'एक्सचेंज ('फैनआउट')' विनिमय प्रकार – Anentropic

उत्तर

1

क्या इससे मदद मिलती है?
http://celery.readthedocs.org/en/latest/userguide/routing.html#exchanges-queues-and-routing-keys

ऐसा प्रतीत होता है ताकि आप Exchange('fanout') विनिमय प्रकार के शीर्ष पर एक अजवाइन कतार, जो कई RabbitMQ कतारों का एक अंतर्निहित कार्यान्वयन होगा परिभाषित कर सकते हैं अजवाइन में 'कतार' परिभाषा विनिमय शामिल है।

इस मामले में मुझे लगता है कि आप सेलेरी कॉन्फ़िगरेशन में 'प्रसारण' कतार नहीं चाहते हैं, जब तक कि आप वास्तव में एक ही कार्य को संसाधित करने वाले एकाधिक श्रमिकों को नहीं चाहते हैं।

+0

यह पुराना उत्तर है और अजवाइन अब 4.x पर है इसलिए मैं दूसरों के लिए अपना अवलोकन छोड़ दूंगा। सबसे पहले - ऐसा लगता है 'Broadcast' कतार में सुधार किया गया था और आप इस तरह अपने कतार परिभाषित कर सकते हैं: प्रसारण (name = 'queue_name', एक्सचेंज (name = 'queue_name', type = 'फैनआउट')' '- कम से कम इस किए गए सभी मेरी RabbitMQ क्लस्टर के भीतर मेजबान मेरे प्रसारण कार्य प्राप्त करने के लिए और मैं कार्यकर्ता शुरू तर्कों के भीतर उस कतार में निर्धारित कर सकते ('-Q: 1 queue_name -c: 1 1')। इसके अलावा यह अगर आप अपने RabbitMQ क्लस्टर हर बार जब आप की स्थिति को मिटाने के लिए याद में मदद करता है नई कतारों विन्यास का परीक्षण करें। उम्मीद है कि यह किसी को मदद मिलती है। – Greg0ry

1

कोड (यह, kombu.common पैकेज में नहीं celery) को देखा और इसे बाहर की कोशिश की है, इसे इस तरह काम करने के लिए लगता है:

  • आप एक Broadcast 'कतार' में 'foo' नाम को परिभाषित अपने अजवाइन विन्यास।
  • यह एक Exchange नाम 'foo', और एक विशिष्ट आईडी के साथ एक auto_delete कतार (uuid के माध्यम से) बनाता है, और उर्फ ​​'foo' के साथ (मुझे नहीं लगता कि उर्फ ​​वास्तव में कहीं भी प्रयोग किया जाता है है, यह संदर्भ के लिए बस नहीं है क्योंकि कतार का असली नाम बेतरतीब ढंग से उत्पन्न होता है)
  • अद्वितीय कतार 'foo' विनिमय के लिए बाध्य है

तो, वर्ग Broadcast नाम पर है, लेकिन यह वास्तव में एक विशिष्ट नामित कतार है कि एक फैनआउट के लिए बाध्य है है अदला बदली। इसलिए जब प्रत्येक कार्यकर्ता शुरू होता है, तो यह अपनी अनूठी कतार बनाता है और प्रशंसक विनिमय के लिए बाध्य करता है।

1

यदि आप सेलेरी 4.0 का उपयोग कर रहे हैं।1+, और प्रसारण आपके लिए काम नहीं कर रहा है, कृपया https://github.com/celery/celery/pull/3934 देखें और क्लोक के समाधान देखें, यह amqp.py के पिछले संस्करण को पुनर्स्थापित करता है और यह मेरे लिए काम करता है।

+0

इस सवाल का, [यह बेहतर होगा] (http://meta.stackoverflow.com/q/8259) जवाब का आवश्यक भागों को यहां शामिल करने का जवाब हो सकता है , और संदर्भ के लिए लिंक प्रदान करते हैं। – Peter