2011-03-17 22 views
14

क्या यह निर्धारित करने का कोई तरीका है कि कोई कार्य गुम हो गया है और फिर से प्रयास करें?पुनः खोया या असफल कार्य (सेलेरी, Django और RabbitMQ)

मुझे लगता है कि खोने का कारण प्रेषक बग या कार्यकर्ता थ्रेड क्रैश हो सकता है।

मैं उन्हें पुनः प्रयास करने की योजना बना रहा था, लेकिन मुझे यकीन नहीं है कि यह निर्धारित करने के लिए कि किन कार्यों को पुनः प्रयास करने की आवश्यकता है?

और यह प्रक्रिया स्वचालित रूप से कैसे करें? क्या मैं अपना खुद का कस्टम शेड्यूलर उपयोग कर सकता हूं जो नए कार्यों को बनाएगा?

संपादित करें: मुझे प्रलेखन से मिला है कि RabbitMQ कभी भी कार्यों को ढीला नहीं करता है, लेकिन क्या होता है जब कार्य निष्पादन के बीच में कार्यकर्ता थ्रेड क्रैश होता है?

उत्तर

26

आपको क्या करना होगा सेट करने के लिए

CELERY_ACKS_LATE = सच

देर पावती मतलब यह है कि कार्य संदेशों के बाद कार्य, नहीं बस से पहले मार डाला गया है, जो डिफ़ॉल्ट व्यवहार है स्वीकार किया जाएगा। इस तरह यदि कर्मचारी खरगोश दुर्घटनाग्रस्त हो जाता है तो एमक्यू के पास अभी भी संदेश होगा।

जाहिर है कि कुल दुर्घटना (खरगोश + श्रमिक) एक ही समय में कार्य को पुनर्प्राप्त करने का कोई तरीका नहीं है, सिवाय इसके कि यदि आप कार्य शुरू करने और कार्य अंत में लॉगिंग लागू करते हैं। व्यक्तिगत रूप से मैं एक कार्य शुरू होने पर हर बार एक मोंगोडब में लिखता हूं और जब कोई कार्य खत्म होता है (स्वतंत्र रूप से परिणाम बनाते हैं), इस तरह से मैं जान सकता हूं कि मोंगो लॉग का विश्लेषण करके कौन सा कार्य बाधित था।

आप सेलरी बेस टास्क क्लास के __call__ और after_return विधियों को ओवरराइड करके आसानी से कर सकते हैं।

आपके कोड का एक टुकड़ा देखने के बाद जो कार्य प्रबंधक (प्रवेश और निकास बिंदु के साथ) के रूप में कार्य लॉगर वर्ग का उपयोग करता है। टास्कलॉगर क्लास बस एक लाइन लिखता है जिसमें एक मोंगोडब उदाहरण में कार्य जानकारी होती है।

def __call__(self, *args, **kwargs): 
    """In celery task this function call the run method, here you can 
    set some environment variable before the run of the task""" 

    #Inizialize context managers  

    self.taskLogger = TaskLogger(args, kwargs) 
    self.taskLogger.__enter__() 

    return self.run(*args, **kwargs) 

def after_return(self, status, retval, task_id, args, kwargs, einfo): 
    #exit point for context managers 
    self.taskLogger.__exit__(status, retval, task_id, args, kwargs, einfo) 

मुझे आशा है कि इस

मदद कर सकता है
संबंधित मुद्दे