2015-04-22 8 views
24

AMQP मेरे समझ के साथ कि संदेश केवल निम्न घटक है:क्यों CELERY_ROUTES में "कतार" और "रूटिंग_की" दोनों हैं?

  1. संदेश के मुख्य भाग
  2. मार्ग कुंजी
  3. विनिमय

कतार आदान-प्रदान से जुड़े होते हैं। संदेशों को कतारों का कोई ज्ञान नहीं हो सकता है। वे सिर्फ एक एक्सचेंज पर पोस्ट करते हैं, और फिर एक्सचेंज प्रकार और रूटिंग कुंजी के आधार पर, संदेशों को एक या अधिक कतारों में भेज दिया जाता है।

सेलेरी में, रूटिंग कार्यों का अनुशंसित तरीका CELERY_ROUTES सेटिंग के माध्यम से होता है। दस्तावेज़ों से, CELERY_ROUTES है ...

राउटर की एक सूची, या कतारों को कार्यों को रूट करने के लिए उपयोग किए जाने वाले एक राउटर। http://celery.readthedocs.org/en/latest/configuration.html#message-routing

और यह एक उदाहरण भी शामिल है ...

feed_tasks कतार में एक काम है, तो आप CELERY_ROUTES सेटिंग में एक प्रविष्टि जोड़ सकते हैं मार्ग के लिए:

CELERY_ROUTES = { 
    'feeds.tasks.import_feed': { 
     'queue': 'feed_tasks', 
     'routing_key': 'feed.import', 
    }, 
} 

लेकिन एक मिनट प्रतीक्षा करें - एएमक्यूपी के अनुसार, संदेश केवल रूटिंग कुंजी के साथ आते हैं! वहां "कतार" क्या बिल्ली है?

इसके अलावा, डिफ़ॉल्ट कतार की यह धारणा है। यदि आप एक ऐसा कार्य करते हैं जो CELERY_ROUTES द्वारा पकड़ा नहीं गया है, तो यह वापस CELERY_DEFAULT_QUEUE पर आता है। लेकिन फिर - एएमक्यूपी में, संदेशों को कतारों के बारे में पता नहीं है। क्या इसके बजाय डिफ़ॉल्ट रूटिंग कुंजी नहीं होनी चाहिए?

उत्तर

12

यह सच है कि जब आप क्यूईज़ पर जाते हैं तो सेलेरी पर कुछ भ्रम होता है, एक बात आपको ध्यान में रखना चाहिए कि कतार पैरामीटर एक सेलेरी कोम्बु क्यू ऑब्जेक्ट को संदर्भित करता है और सीधे एएमक्यूपी कतार में नहीं, आप समझ सकते हैं यह extract from the docs पढ़कर। बेशक तथ्य यह है कि अजवाइन कतार बनाता है और उसी नाम के साथ विनिमय कतार पैरामीटर के उपयोग की भ्रम की उत्पत्ति है। हमेशा डॉक्स में आप इस पैरा पढ़ सकते हैं:

CELERY_QUEUES = (
    Queue('feed_tasks', routing_key='feed.#'), 
    Queue('regular_tasks', routing_key='task.#'), 
    Queue('image_tasks', exchange=Exchange('mediatasks', type='direct'), 
         routing_key='image.compress'), 
) 

तो:

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

class MyRouter(object): 

    def route_for_task(self, task, args=None, kwargs=None): 
     if task == 'myapp.tasks.compress_video': 
      return {'exchange': 'video', 
        'exchange_type': 'topic', 
        'routing_key': 'video.compress'} 
     return None 

यहाँ http://celery.readthedocs.org/en/latest/userguide/routing.html#routers

नहीं
+0

को समझने के लिए यकीन है कि अधिक: कतार बुला() का दृष्टांत ... एक बंधन और नहीं एक कतार ? –

+3

किसी भी तरह से आप कह सकते हैं कि कोम्बु में कतार वस्तु एक एएमक्यूपी कतार से मेल खाती है जो एक निश्चित रूटिंग कुंजी के साथ एक एक्सचेंज से जुड़ी होती है। –

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