2012-02-15 12 views
15

मैं सेलेरीबीट के आसपास काम करने के लिए अनुशंसित समाधान की तलाश कर रहा हूं, जो अजवाइन/खरगोश की तैनाती के लिए विफलता का एक बिंदु है। मुझे वेब पर खोज करके अब तक कुछ भी नहीं मिला है।विफलता के एक बिंदु होने के कारण सेलेरीबीट के आसपास काम

मेरे मामले में, एक बार दिन का समय शेड्यूलर नौकरियों की एक श्रृंखला को बंद कर देता है जो आधा दिन या उससे अधिक समय तक चल सकता है। चूंकि केवल एक सेलेरीबीट उदाहरण हो सकता है, अगर ऐसा होता है या सर्वर जो चल रहा है, तो महत्वपूर्ण नौकरियां नहीं चलेंगी।

मुझे उम्मीद है कि इसके लिए पहले से ही एक कामकाजी समाधान है, क्योंकि मैं केवल एकमात्र नहीं हूं जिसे विश्वसनीय (क्लस्टर या जैसे) शेड्यूलर की आवश्यकता हो। अगर मुझे ऐसा करने की ज़रूरत नहीं है, तो मैं कुछ प्रकार के डेटाबेस-समर्थित शेड्यूलर का सहारा लेना नहीं चाहता हूं।

उत्तर

5

इस बारे में अजवाइन जिथब रेपो में एक खुली समस्या है। पता नहीं है कि वे इस पर काम कर रहे हैं या नहीं।

एक कामकाज के रूप में आप कार्यों के लिए एक ताला जोड़ सकते हैं ताकि एक समय में विशिष्ट आवधिक कार्य का केवल 1 उदाहरण चल सके।

कुछ की तरह:

if not cache.add('My-unique-lock-name', True, timeout=lock_timeout): 
    return 

ताला टाइमआउट इसके बारे में पता अच्छी तरह से मुश्किल है। हम अलग-अलग celerybeats अलग-अलग समय पर चलाने की कोशिश करेंगे, तो हम 0.9 * कार्य run_every सेकंड का उपयोग कर रहे हैं। 0.9 बस कुछ मार्जिन छोड़ने के लिए (उदाहरण के लिए जब सेलेरी एक बार शेड्यूल के पीछे थोड़ा सा है, तो यह शेड्यूल पर है जो लॉक को अभी भी सक्रिय होने का कारण बनता है)।

फिर आप सभी मशीनों पर सेलेरीबीट उदाहरण का उपयोग कर सकते हैं। प्रत्येक कार्य को प्रत्येक सेलेरीबीट उदाहरण के लिए कतारबद्ध किया जाएगा, लेकिन उनमें से केवल एक ही कार्य रन समाप्त हो जाएगा।

कार्य अभी भी run_every का सम्मान करेंगे - सबसे खराब स्थिति परिदृश्य: कार्य 0.9 * रन_ हर गति पर चलेंगे।

इस मामले के साथ एक मुद्दा: यदि कार्यों को कतारबद्ध किया गया था लेकिन निर्धारित समय पर संसाधित नहीं किया गया था (उदाहरण के लिए क्योंकि कतार प्रोसेसर अनुपलब्ध था) - तो लॉक गलत समय पर रखा जा सकता है जिससे संभावित रूप से 1 अगला कार्य आसानी से नहीं चल रहा है। इसके आस-पास जाने के लिए आपको किसी प्रकार की पहचान तंत्र की आवश्यकता होगी चाहे कार्य समय पर कम या कम हो।

फिर भी, उत्पादन में उपयोग करते समय यह एक सामान्य स्थिति नहीं होनी चाहिए।

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

यह निश्चित रूप से पहले समाधान के संयोजन में उपयोग किया जा सकता है।

इसके लिए काम करने के लिए कैश बैकएंड को दोहराने और/या सभी सर्वरों के लिए साझा करने की आवश्यकता है।

यह एक पुराना सवाल है, लेकिन मुझे उम्मीद है कि यह किसी की भी मदद करेगा।

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