मेरे पास ईटीए कार्य हैं जो सेलेरी के लिए रेडिस ब्रोकर को भेजे जाते हैं। यह एक ही अजवाइन और रेडिस उदाहरण है, दोनों एक ही मशीन int।
समस्या यह है कि, कार्यों को कई बार निष्पादित किया जा रहा है। मैंने 4 से 11 बार कार्यों को देखा है।
मैंने दृश्यता का समय 12 घंटे निर्धारित किया है, यह देखते हुए कि मेरे ETA के 4-7 घंटे (रनटाइम पर निर्धारित) हैं
BROKER_TRANSPORT_OPTIONS = {"visibility_timeout": 12 * 60 * 60}
यहां तक कि, कार्यों को अभी भी कई बार निष्पादित किया जाता है।
प्रारंभ में, विचाराधीन कार्य निष्प्राण नहीं था, इसलिए मैंने उन्हें निष्प्राण बनाने के लिए डीबी चेक में जोड़ने का प्रयास किया।
यह कुछ इस तरह दिखता है:
@app.task
def foo(side_effect_action):
if side_effect_action.executed:
return ALREADY_EXECUTED
else:
do_side_effect()
side_effect_action.executed = True
side_effect_action.save() #hits the db
return JUST_EXECUTED
पता चलता है कि फू से कॉल करने में सक्षम होने से पहले अजवाइन कार्यकर्ता को कार्य के लिए मिलता है side_effect_action.save()
और राज्य को बचाओ, इसलिए सभी मामलों में जब वह तलाश कर रहा है side_effect_action.executed
यह अभी भी गलत है, और इस प्रकार कई बार निष्पादित हो जाता है।
किसी भी विचार मैं इस मुद्दे को कैसे हल कर सकता हूं?
उत्तर:
जवाब के लिए 2 № 1मैंने बचने के लिए अपने अजवाइन ब्रोकर को RabbitMQ में बदल दियाइस मुद्दे। यह दुर्भाग्यपूर्ण है क्योंकि मेरे पास अब मेरे वेबएप में एक और घटक है (मुझे अभी भी कुछ और के लिए रेडिस की आवश्यकता है), लेकिन इसने ईटीए कार्यों बग के लिए कई निष्पादन को हल किया।