2014-09-30 12 views
5

मैंसेलेरी कार्यकर्ता: सभी कतारों से कैसे उपभोग करें?

  • सेट CELERY_CREATE_MISSING_QUEUES = True
  • नहीं CELERY_QUEUES
  • परिभाषित CELERY_DEFAULT_QUEUE = 'default'
  • एक कस्टम रूटर वर्ग कि मक्खी पर मार्गों के रूप में इस टिकट में दिखाया गया है बनाता है (https://github.com/celery/celery/issues/150) (प्रत्यक्ष प्रकार के) में परिभाषित किया गया है ।

मुझे लगता है कि कस्टम राउटर द्वारा दिए गए मार्ग में नई कतार बनाई गई है जो मुझे लगता है कि CELERY_CREATE_MISSING_QUEUES की वजह से है।

कार्यकर्ता नोड है कि मैं चलाने में अब, मैं -Q तर्क पारित नहीं है और यह 'डिफ़ॉल्ट' कतार जो प्रलेखन के साथ लाइन में हो रहा है से केवल खपत -

डिफ़ॉल्ट यह तक CELERY_QUEUES सेटिंग में परिभाषित सभी कतारों से उपभोग करेगा (जो कि कतार नामक सेलेरी के लिए डिफ़ॉल्ट निर्दिष्ट नहीं है)।

क्या मेरे कार्यकर्ता नोड को सभी कतारों से उपभोग करने के लिए कोई तरीका है जिसमें गतिशील रूप से बनाए गए हैं?

धन्यवाद,

उत्तर

3

कार्यकर्ता, इन स्वचालित रूप से या डायनामिक रूप से तैयार कतारों के बारे में बताया जाना ताकि आप इन कतार नाम हो जाते हैं और जब आपने उन्हें बनाया उन्हें शायद स्टोर या उन्हें rabbitmqctl list_queues से हो सकता है पाने के लिए कोई तरीका होना चाहिए की जरूरत है अगर आप ब्रोकर के रूप में RabbitMQ का उपयोग कर रहे हैं, और उदाहरण के लिए श्रमिकों को इन गतिशील कतारों को उपभोग करने के लिए एक सिग्नल हैंडलर जोड़ें।

celeryd_after_setup संकेत का उपयोग कर उदाहरण के लिए:

from celery.signals import celeryd_after_setup 

@celeryd_after_setup.connect 
def add_dynamic_queue(sender, instance, **kwargs): 
    # get the dynamic queue, maybe stored somewhere 
    queue = 'dynamic_queue' 
    instance.app.amqp.queues.select_add(queue) 

आप हमेशा नए गतिशील कतारों बनाया है, तो आप भी कार्यकर्ताओं को आदेश का उपयोग कर कार्यावधि में इन कतारों से लेने शुरू करने के लिए कर सकते हैं:

#command all workers to consume from the 'dynamic_queue' queue 
app.control.add_consumer('dynamic_queue', reply=True) 

# command specific workers 
app.control.add_consumer('dynamic_queue', reply=True, destination=[[email protected]]) 

देखें Adding Consumers

मुझे आशा है कि इससे मदद मिलती है, जब मैं इस बारे में अधिक जानकारी प्राप्त करता हूं तो मैं प्रश्न संपादित कर दूंगा।

+0

धन्यवाद। वह दिलचस्प था। हां, मैं RabbitMQ का उपयोग करता हूं और मैं हमेशा गतिशील कतार रखने की योजना बना रहा था। मैं उम्मीद कर रहा था कि मैं किसी प्रकार के वाइल्डकार्ड पैटर्न का उपयोग करके कार्यकर्ता को सभी कतारों से उपभोग करने के लिए कह सकता हूं। मैं अब आपके सुझावों का प्रयास करने जा रहा हूं। प्रश्न - यह देखते हुए कि श्रमिक अलग-अलग सर्वरों पर चल रहे हैं, संदेश ब्रोकर एकमात्र आम टुकड़ा है, app.control.add_consumer (...) कर्मचारियों को जानकारी कैसे संवाद करता है? – ksrini

+0

@ksrini हाँ मैं यह पता लगाने के लिए स्रोत कोड खोज रहा था कि क्या हम वाइल्डकार्ड पैटर्न का उपयोग कर सकते हैं, लेकिन जिस विधि को कतारों को उपभोग करने के लिए सेट किया जाता है, उसे अल्पविराम से अलग पंक्तियों की एक सूची की आवश्यकता होती है। और नियंत्रण आदेश ब्रोकर (RabbitMQ) का उपयोग श्रमिकों को संदेशों को प्रसारित करने के लिए मॉड्यूल 'celery.app.control' जांचते हैं। – Pierre

+0

add_consumer नियंत्रण कमांड का उपयोग कर आपके सुझाए गए दृष्टिकोण काम किया! धन्यवाद!मैं केवल add_consumer का आह्वान करना चाहूंगा यदि मजदूर पहले से ही उस कतार से उपभोग नहीं कर रहे हैं क्योंकि add_consumer में कुछ समय लगता है (लगभग 1-2 सेकंड) अगर उत्तर = सही है और मैं राउटर से ऐसा करने की योजना बना रहा हूं जहां मैं निर्धारित करता हूं मार्ग के हिस्से के रूप में नई कतार। अगर मैं उत्तर = गलत सेट करता हूं, तो यह तेज़ है। क्या आप add_consumer invoking के साथ कोई समस्या देखते हैं भले ही श्रमिक पहले से ही उस कतार से उपभोग कर रहे हों? – ksrini

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