2015-05-07 16 views
15

डिफ़ॉल्ट रिस्क्यू वेब इंटरफ़ेस का कहना है कि मेरे पास 7 में से 7 कर्मचारी काम कर रहे हैं। मुझे समझ में नहीं आता कि यह कैसे हो सकता है।यह निर्धारित करने के लिए कि क्या यह मर चुका है या पुराना है

मैं उसकेोकू पर हूं, इसलिए जब मेरा डिनो पुनरारंभ होता है, तो इसे मौजूदा डायनोस और श्रमिकों को स्पिन करना चाहिए, फिर नए स्पिन करें। इसलिए, मुझे लगता है कि इनमें से कुछ कर्मचारी बेवकूफ हैं, लेकिन रेस्क सोचते हैं कि वहां से बहुत से श्रमिक काम कर रहे हैं ... (केवल 1 होना चाहिए)

मैं कैसे जांच सकता हूं कि इनमें से कोई भी है या नहीं बासी या मृत? मैं केवल 1 कार्यकर्ता काम करने की उम्मीद करता हूं।

आखिरकार, मुझे उम्मीद है कि मैं यह भी करूंगा जो कुछ भी पोस्ट करता है: How do I clear stuck/stale Resque workers?, लेकिन पहले मैं यह जानना चाहता हूं कि एक कार्यकर्ता को हटाया जाना चाहिए या नहीं ... मैं अंधेरे से श्रमिकों को अपंजीकृत नहीं करना चाहता ...

क्षमा करें यदि यह एक स्पष्ट प्रश्न है। मैं resque करने के लिए नया हूँ।

धन्यवाद!

+0

यह http: //www.rubydoc.info/gems/resque/Resque/Worker .... – Milind

+1

देखें जैसा कि मैंने इस प्रश्न में उल्लेख किया है, मुझे पहले से ही पता है कि इंटरनेट को लगता है कि मेरी समस्या का अंतिम समाधान क्या है ('unregister_worker' को कॉल करना)। यह मेरे लिए अस्पष्ट है कि आप यह जांच नहीं करेंगे कि आप वास्तव में इस कोड को चलाने से पहले कार्यकर्ता को अपंजीकृत कर सकते हैं या नहीं। यदि आप इसे चलाते समय वर्तमान में कोई कर्मचारी चल रहा है तो क्या होगा? अंधेरे से बुलाए गए 'unregister_worker' के दुष्प्रभाव क्या हैं? – user5243421

+0

इसके अलावा, यह मुझे केवल सभी कार्यकर्ता दस्तावेज़ों से जोड़ने में मदद नहीं करता है। मैं स्पष्ट रूप से समझ नहीं पा रहा हूं कि कहां से शुरू करना है। मुझे किस विधि का संदर्भ देना चाहिए? – user5243421

उत्तर

8

एक ही रास्ता निर्धारित करने के लिए एक कार्यकर्ता वास्तव में काम कर रहा है कार्यकर्ता की होस्ट मशीन पर जांच करने के लिए है। हेरोोकू पर पुनरारंभ करने के बाद, यह मशीन अब मौजूद नहीं है, इसलिए यदि कर्मचारी स्वयं को पंजीकृत नहीं करता है तो Resque विश्वास करेगा कि यह अभी भी काम कर रहा है। Resque श्रमिकों की विकेन्द्रीकृत प्रकृति का मतलब है कि आप आसानी से श्रमिकों की वास्तविक स्थिति की जांच नहीं कर सकते हैं। जब प्रत्येक कर्मचारी शुरू होता है तो यह खुद को रेडिस के साथ पंजीकृत करता है। जब वह कार्यकर्ता नौकरी उठाता है और फिर से काम करना शुरू कर देता है तो उसे फिर से लालसा के साथ स्थिति पंजीकृत करता है। जब आप ऐसा तरह पुनरावृति:

Resque.workers.each { |w| w.working? } 

आप redis से श्रमिकों की एक सूची खींच रहा है और उन कर्मचारियों प्रपत्र redis के अंतिम पंजीकृत राज्य जाँच कर रहे हैं। यह वास्तव में कार्यकर्ता से खुद पूछता नहीं है।

रेस्क्यू-वेब डिस्प्ले में होस्टनाम आपके द्वारा दिखाए गए नामों के साथ मेल खाते हैं जो कि वास्तव में चल रहा है यह देखने के लिए एक बहुत अच्छा तरीका नहीं है। मैं उम्मीद कर रहा था कि कोई प्लेटफार्म एपीआई बनाने वाले डायनो आईडी का उपयोग कर स्वचालित हो सकता है लेकिन वे होस्टनाम से मेल नहीं खाते हैं।

सुनिश्चित करें कि आप में निर्दिष्ट अनुसार Resque::TermException पर ध्यानपूर्वक रख रहे हैं। आप heartbeat solutions में से कुछ को भी देख सकते हैं अन्य इस समस्या के आसपास काम करने के लिए आए हैं। मेरे पास ऐसे मुद्दे थे जहां TERM_CHILD का उपयोग भी किया गया था और उचित सिग्नल हैंडलिंग पत्तियां स्टेल श्रमिकों के आसपास तैर रही थीं। मेरा समाधान तब तक इंतजार करना है जब तक कि कोई नौकरियां संसाधित नहीं हो जातीं, सभी श्रमिकों को अनधिकृत करें, फिर heroku ps:restart worker के साथ पुनरारंभ करें।

+0

यह एक अच्छा जवाब है। मेरी स्थिति के साथ बात यह है कि मेरे ऐप के लिए हर समय काम करने वाले बहुत सारे कर्मचारी काम करते हैं।यह तब तक प्रतीक्षा करने का एक व्यवहार्य विकल्प नहीं है जब तक कि कोई नौकरियां संसाधित नहीं हो जातीं, लेकिन आपके उत्तर के लिए धन्यवाद! – user5243421

3

इस प्रयास करें:

Resque.workers.each do |w| 
    if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 7.days 
    w.unregister_worker 
    end 
end 
+0

यह सबसे अच्छा जवाब हो सकता है जो मैं प्राप्त कर सकता हूं। बालों के कर्मचारियों को अभी भी लगता है कि वे कुछ पर काम कर रहे हैं, इसलिए मैं वास्तव में 'प्रसंस्करण' या 'काम कर रहे' जैसे सामान्य झंडे का उपयोग नहीं कर सकता ... – user5243421

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