2013-02-25 68 views
9

जब हम पुनरारंभ या तैनाती करते हैं तो हमें Resque::TermException (SIGTERM) या Resque::DirtyExit के साथ असफल कतार में कई रेजिक नौकरियां मिलती हैं।रेस्क्यू :: टर्मएक्सप्शन या हेगोकू पर SIGTERM से पुनर्प्राप्त करना

हम नए TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 हमारे Procfile में उपयोग कर रहे हैं तो हमारे कार्यकर्ता लाइन लगता है:

worker: TERM_CHILD=1 RESQUE_TERM_TIMEOUT=10 bundle exec rake environment resque:work QUEUE=critical,high,low 

हम भी resque-retry उपयोग कर रहे हैं जो मैंने सोचा था कि इन दो अपवाद पर हो सकता है ऑटो पुन: प्रयास? लेकिन ऐसा नहीं लगता है।

  1. हम स्वयं हर काम में Resque::TermException से बचाव कर सकता है, और इस का उपयोग काम को फिर से शेड्यूल:

    तो मैं दो सवाल लगता है। लेकिन क्या सभी नौकरियों के लिए ऐसा करने का एक साफ तरीका है? एक बंदर पैच भी।

  2. पुन: पुनः प्रयास नहीं करना चाहिए पुनः प्रयास करें? क्या आप किसी भी कारण से सोच सकते हैं कि ऐसा क्यों नहीं होगा?

धन्यवाद!

संपादित करें: 10 सेकंड से कम समय में पूरा करने के लिए सभी नौकरियां प्राप्त करना पैमाने पर अनुचित लगता है। ऐसा लगता है कि Resque :: DirtyExit अपवाद चलाए जाने पर इन नौकरियों को स्वचालित रूप से फिर से कतारबद्ध करने का एक तरीका होना चाहिए।

उत्तर

1

क्या आपके रिस्क जॉब्स को पूरा होने में 10 सेकंड से अधिक समय लग रहा है? यदि प्रारंभिक SIGTERM भेजे जाने के बाद 10 सेकंड के भीतर नौकरियां पूरी हो जाती हैं तो आपको ठीक होना चाहिए। जल्दी खत्म होने वाले छोटे हिस्सों में नौकरियों को तोड़ने का प्रयास करें।

इसके अलावा, आप अपने कार्यकर्ता फिर से कतारबद्ध कुछ इस तरह कर रही है काम हो सकता है: हर काम में https://gist.github.com/mrrooijen/3719427

+0

upvoted और स्वीकार किए जाते हैं - मैं ईमानदारी से यकीन है कि अगर हम हालांकि 10 सेकंड के तहत उन सब को मिल सकता है नहीं कर रहा हूँ। हमारे पास कुछ बड़े निर्यात आदि हैं जिन्हें एक फ़ाइल उत्पन्न करने की आवश्यकता है। पुन: enquueing लगता है जैसे यह हल करता है हालांकि? क्या आप साझा कर सकते हैं कि 'Resque :: TermException' और 'Resque :: DirtyExit' के बीच क्या अंतर है। मुझे 'Resque :: DirtyExit' के लिए वहां एक बचाव है लेकिन यह हमेशा फिर से enqueue प्रतीत नहीं होता है। धन्यवाद! –

+0

अद्यतन के रूप में, वे नौकरी में 'बचाव बचाव :: DirtyExit' होने के बावजूद कभी-कभी उन अपवादों को स्पष्ट रूप से नहीं बचाते हैं। मैं समझने में सक्षम नहीं हूं क्यों। यह हमारी नौकरियों को अविश्वसनीय बना रहा है क्योंकि हम अभी भी उन्हें Resque :: DirtyExit अपवादों के साथ असफल कतार में पाते हैं। यह वास्तव में एक समस्या बन रहा है –

+0

क्या कोई सलाह दे सकता है कि कार्यकर्ता को कार्यकर्ता के अंदर SIGTERM को कैसे संभालना चाहिए ताकि कार्यकर्ता खुद को साफ कर सके? उदाहरण के लिए, क्या (रेस्क्यू) कार्यकर्ता SIGTERM को भी फंसाना चाहिए और कुछ चर सेट करना चाहिए कि लूपिंग कोड समय-समय पर निरीक्षण करता है? मैं मानता हूं कि TermException या DirtyException केवल RESQUE_TERM_TIMEOUT सेकेंड के बाद रैली की जाती है। –

1
  1. हम स्वयं Resque से बचाव कर सकता है :: TermException, और इस का उपयोग काम को फिर से शेड्यूल । लेकिन क्या सभी नौकरियों के लिए करने का कोई साफ तरीका है? एक बंदर पैच भी।

जब काम SIGTERM संकेत के साथ मार दिया जाता है Resque::DirtyExit अपवाद उठाया है। नौकरी के पास अपवाद को पकड़ने का अवसर नहीं है क्योंकि आप read here कर सकते हैं।

  1. ऑटो को पुन: प्रयास करना पुनः प्रयास नहीं करना चाहिए? क्या आप किसी भी कारण से सोच सकते हैं कि ऐसा क्यों नहीं होगा?

कारण है कि यह, अनुसूचक नहीं चल रहा है चाहिए नहीं दिख रहा? यदि rake resque:scheduler नहीं है।

मैं समस्याओं मैं हाल ही में Resque::DirtyExit के साथ किया था के कुछ चारों ओर एक विस्तृत ब्लॉग पोस्ट में लिखा है, शायद यह उपयोगी = है>Understanding the Resque internals – Resque::DirtyExit unveiled

0

मैं भी एक विश्वसनीय समाधान ढूँढने के बिना कुछ समय के लिए इस के साथ संघर्ष किया है।

मुझे मिले कुछ समाधानों में से एक शेड्यूल पर एक रेक कार्य चला रहा है (हर 1 मिनट में क्रॉन जॉब) जो रेस्क :: डर्टीएक्सिट के साथ असफल नौकरियों की तलाश में है, इन विशिष्ट नौकरियों को पुनः प्रयास करता है और इन नौकरियों को विफलता से हटा देता है कतार।

यहाँ रेक कार्य https://gist.github.com/CharlesP/1818418754aec03403b3

का एक नमूना यह समाधान स्पष्ट रूप से करने से इनकी है लेकिन आज तक यह सबसे अच्छा समाधान मैं इन नौकरियों पुन: प्रयास करना पाया गया है।

2

मैं इस मुद्दे में भी भाग गया। यह पता चला है कि हेरोोकू SIGTERM सिग्नल केवल माता-पिता की प्रक्रिया के लिए ही नहीं बल्कि सभी फोर्क प्रक्रियाओं को भेजता है। यह तर्क नहीं है कि रेस्क उम्मीद करता है कि RESQUE_PRE_SHUTDOWN_TIMEOUT को छोड़ने के कारण, नौकरी खत्म करने के प्रयास के बिना किसी भी समय निष्पादित करने के लिए नौकरियों को मजबूर करना पड़ता है।

हरोकू SIGTERM जारी किए जाने के बाद श्रमिकों को शानदार बंद करने देता है। ज्यादातर मामलों में, नौकरी खत्म करने के लिए नौकरी खत्म करने के लिए पर्याप्त समय है, अगर नौकरी खत्म नहीं हो पाती है तो रिस्क को नौकरी की आवश्यकता होती है। हालांकि, इस समय का उपयोग करने के लिए आपको RESQUE_PRE_SHUTDOWN_TIMEOUT और RESQUE_TERM_TIMEOUT एनवी वर्र्स के साथ-साथ पैच रेस्क को SIGTERM को फोर्क प्रक्रियाओं को सही ढंग से प्रतिक्रिया देने की आवश्यकता है।

यहाँ एक मणि जो resque पैच और अधिक विस्तार में इस मुद्दे को बताते है:

https://github.com/iloveitaly/resque-heroku-signals

+0

यह सही स्पष्टीकरण है। धन्यवाद @iloveitaly – Yoni

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

  • कोई संबंधित समस्या नहीं^_^