2011-08-22 21 views
20

मैं खरगोश एमक्यू के साथ सेलेरी का उपयोग कर रहा हूं। हाल ही में, मैंने देखा है कि बड़ी संख्या में अस्थायी कतारें मिल रही हैं।सेलेरी में निर्मित अस्थायी कतार

तो, मैं प्रयोग किया और पाया कि जब किसी कार्य में विफल रहता है (है कि एक कार्य एक अपवाद को जन्म देती है), तो एक यादृच्छिक नाम (c76861943b0a4f3aaa6a99a6db06952c की तरह) के साथ एक अस्थायी कतार बनाई है और कतार बनी हुई है।

अस्थायी कतार के रूप में rabbitmqadmin में पाई जाने वाली कुछ गुण इस प्रकार हैं -

auto_delete: यह सच है उपभोक्ताओं: 0 टिकाऊ: गलत संदेशों: 1 messages_ready: 1

और ऐसे ही एक अस्थायी कतार हर बार एक कार्य विफल रहता है (यानी, एक अपवाद उठाता है)। इस स्थिति से कैसे बचें? क्योंकि मेरे उत्पादन वातावरण में ऐसी बड़ी संख्या में कतार बनती हैं।

+0

यह एक दिलचस्प अवलोकन है! मैं भी जानना चाहता हूं। –

+1

हाय एल्वर। मैं समस्या को हल करने में सक्षम था। कृपया उत्तर पर एक नज़र डालें (मेरे द्वारा भी एक)। आशा करता हूँ की ये काम करेगा। – Siddharth

उत्तर

11

ठीक है, फिलिप ठीक है। निम्नलिखित वर्णन है कि मैंने इसे कैसे हल किया। यह celeryconfig.py में एक विन्यास है।

फिलिप ने कहा था कि मैं अभी भी CELERY_BACKEND = "amqp" का उपयोग कर रहा हूं। लेकिन इसके अलावा, अब मैं CELERY_IGNORE_RESULT = True का उपयोग कर रहा हूं। यह कॉन्फ़िगरेशन यह सुनिश्चित करेगा कि प्रत्येक कार्य के लिए अतिरिक्त कतारें नहीं बनाई गई हैं।

मैं पहले से ही इस कॉन्फ़िगरेशन का उपयोग कर रहा था लेकिन फिर भी जब कोई कार्य विफल हो जाता है, तो अतिरिक्त कतार का गठन किया गया था। तब मैंने देखा कि मैं एक और कॉन्फ़िगरेशन का उपयोग कर रहा था जिसे हटाया जाना आवश्यक था जो CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True था। इसने क्या किया है कि उसने सभी कार्यों के लिए परिणामों को संग्रहित नहीं किया है, बल्कि केवल त्रुटियों के लिए किया है (कार्य विफल हुए हैं) और इसलिए विफल कार्य के लिए एक अतिरिक्त कतार।

+0

वाह! यह मेरे लिए हल हो गया। मुझे यह भी एहसास नहीं हुआ कि यह एक मुद्दा था क्योंकि मैं प्रत्येक कार्य वर्णनकर्ता में ignore_result = True सेट कर रहा था। लेकिन मैंने CELERY_IGNORE_RESULT = True और CELERY_STORE_ERRORS_EVEN_IF_IGNORED = गलत और व्हायोला जोड़ा - प्रसंस्करण के बाद चारों ओर लटका कोई और अतिरिक्त कतार नहीं! मैं अभी भी एक विकल्प के रूप में बैकएंड redis में लग सकता है, लेकिन यह वास्तव में इस समाधान पाया है अच्छा है। धन्यवाद! – chaimp

+0

@jeffp - यह सुनकर खुशी हुई। मैंने हाल ही में सेलेरी के साथ रेडिस का भी उपयोग किया है - मुझे नहीं लगता कि यह उसमें एक समस्या है। अजवाइन स्वयं कतार बनाते हैं और बनाए रखता है। तो यह विन्यास महत्वपूर्ण है। – Siddharth

+1

मैं वास्तव में पिछले एक दिन मैं यह पढ़ किसी के लिए भी बहुत उपयोगी हो जाएगा लगता है कि में एक और बात की खोज की: यह एक से अधिक कार्यकर्ता और प्रत्येक कार्यकर्ता के लिए रास्ते में विभिन्न कार्यों के लिए आवश्यक है। सेलरीड-मल्टी के बारे में जानना और इसका उपयोग करना उचित है। दस्तावेज़ीकरण यह स्पष्ट नहीं करता है, लेकिन यह उपलब्ध सिस्टम संसाधनों का प्रभावी ढंग से उपयोग करने और कतार को बैक अप देने की कुंजी नहीं है। – chaimp

16

ऐसा लगता है जैसे आप परिणाम बैकएंड के रूप में amqp का उपयोग कर रहे हैं।

  • हर नया कार्य कार्यों दलाल कतारों के साथ ओवरलोड हो गया है और इस
    को प्रभावित करेगा के हजारों के साथ, सर्वर पर एक नया कतार बनाता है: docs यहाँ से है कि विशेष सेटअप का उपयोग करने का नुकसान कर रहे हैं नकारात्मक तरीकों से प्रदर्शन। आप RabbitMQ उपयोग कर रहे हैं तो प्रत्येक
    कतार, एक अलग Erlang प्रक्रिया होगी, इसलिए यदि आप
    की योजना बना रहे कई परिणाम एक साथ रख आप Erlang
    प्रक्रिया सीमा बढ़ाने के लिए हो सकता है, और फ़ाइल वर्णनकर्ता की अधिकतम संख्या अपने OS
    की अनुमति देता है
  • पुरानी परिणाम स्वचालित रूप से साफ नहीं किया जाएगा, ताकि आप परिणाम वरना कतारों की संख्या का उपभोग करने के अंततः नियंत्रण से बाहर जाना होगा यकीन करना चाहिए। यदि आप RabbitMQ 2.1.1 या उच्चतर चला रहे हैं तो आप एक्स-एक्सपर्स तर्क का कतार, पर लाभ उठा सकते हैं जो अप्रयुक्त होने के बाद निश्चित समय सीमा के बाद कतार समाप्त कर देगा। कतार समाप्ति CELERY_AMQP_TASK_RESULT_EXPIRES सेटिंग (डिफ़ॉल्ट रूप से सक्षम नहीं) द्वारा सेट की जा सकती है (सेकेंड में)।

मैं क्या changelog में पढ़ा है से, यह नहीं रह गया है संस्करणों> = 2.3.0 क्योंकि उपयोगकर्ताओं को इस व्यवहार से पीछे अंत में थोड़ा मिल रहे थे में डिफ़ॉल्ट बैकएंड है। मैं परिणाम बैकएंड को बदलने का सुझाव दूंगा यदि यह आपको आवश्यक कार्यक्षमता नहीं है।

+0

CELERY_AMQP_TASK_RESULT_EXPIRES को बहिष्कृत कर दिया गया है, CELERY_TASK_RESULT_EXPIRES नया कॉन्फ़िगरेशन सेटिंग नाम है। डिफ़ॉल्ट अब इसे 1 दिन के लिए सहेजने के लिए है, इसे 0 पर सेट करना हमेशा के लिए रखें। – cbron

3

CELERY_TASK_RESULT_EXPIRES अस्थायी कतारों के रहने के लिए समय निर्धारित करता है। डिफ़ॉल्ट 1 दिन है। आप इस मान को संशोधित कर सकते हैं।

0

कारण यह हो रहा है क्योंकि celery workers remote control (यह डिफ़ॉल्ट रूप से सक्षम किया गया है) सक्षम है।

आप झूठी हालांकि करने के लिए CELERY_ENABLE_REMOTE_CONTROL सेटिंग सेट करके आप उसे निष्क्रिय कर सकते हैं, ध्यान दें कि आप celery command

0

amqp बैकएंड का उपयोग कर add_consumer, cancel_consumer आदि जैसे कार्य करने की क्षमता खो देंगे प्रत्येक कार्य के लिए एक नया कतार पैदा करता है। आप इसे से बचना चाहते हैं, तो आप rpc बैकएंड जो एक कतार में परिणाम रहता है उपयोग कर सकते हैं।

अपने config में, सेट

CELERY_RESULT_BACKEND = 'rpc' 
CELERY_RESULT_PERSISTENT = True 

आप this on celery docs के बारे में अधिक पढ़ सकते हैं।

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