2013-03-25 6 views
7

मैं एक सेटअप में देरी नौकरी का उपयोग कर रहा हूं जहां मैं कई श्रमिक चलाता हूं। मेरे प्रश्न के लिए, यह वास्तव में कोई फर्क नहीं पड़ता, लेकिन मान लें कि मैं 10 श्रमिक चलाता हूं (वर्तमान में विकास मोड में ऐसा कर रहा हूं)।एक ही नौकरी शुरू करने में कई देरी वाली नौकरी प्रक्रियाएं

मेरी समस्या यह है कि दो अलग-अलग कर्मचारी कभी-कभी एक ही नौकरी पर काम करना शुरू करते हैं, जो मेरी नौकरी वस्तु पर प्रदर्शन विधि को बुलाता है।

मेरी समझ में सबसे अच्छा करने के लिए देरी नौकरी निराशाजनक लॉकिंग का उपयोग करने से रोकने के लिए उपयोग कर रही है, लेकिन ऐसा लगता है कि कभी-कभी पहले कार्यकर्ता को वास्तव में इसे लॉक करने का समय होने से पहले नौकरी चोरी करने के लिए पर्याप्त समय होता है।

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

मैं अपनी नौकरियों के भीतर इसके आसपास काम करने की कोशिश करूंगा, लेकिन यह अभी भी कुछ समस्याग्रस्त है कि ऐसा होता है। आदर्श रूप में यह कभी नहीं होगा कि नौकरी की नौकरी दो प्रक्रियाओं से एक ही नौकरी पर काम करती है।

धन्यवाद!

+0

मुझे कुछ समान दिखता है। इसे पूरी तरह से ट्रैक करने में सक्षम नहीं है, लेकिन ऐसा लगता है कि लॉक की जांच करने और लॉक बनाने के बीच, कई कर्मचारी नौकरी पकड़ रहे हैं और नौकरी निष्पादित कर रहे हैं। –

+0

मुझे यह कहना चाहिए कि मैंने प्रारंभिक में ''' देरी :: कार्यकर्ता.read_ahead = 1''' सेटिंग को पाया, समस्या को कम करने लग रहा था। –

+0

Resque के साथ एक ही समस्या थी, समाधान नहीं मिला –

उत्तर

0

हमने 12 श्रमिकों के साथ देरी नौकरी के माध्यम से लगभग 60 मिलियन नौकरियां चलाई हैं और इसकी कोई रिपोर्ट नहीं हुई है। एसक्यूएल क्या है कि आपका देरी नौकरी कार्यकर्ता चल रहा है? क्या आप एक मणि का उपयोग कर रहे हैं जो पोस्टग्रेज़ के लॉकिंग व्यवहार को बदल रहा है?

UPDATE "delayed_jobs" SET locked_at = '2014-05-02 21:16:35.419748', locked_by = 
'host:whatever.local pid:4729' WHERE id IN (SELECT id FROM "delayed_jobs" 
WHERE ((run_at <= '2014-05-02 21:16:35.415923' 
AND (locked_at IS NULL OR locked_at < '2014-05-02 17:16:35.415947') 
OR locked_by = 'host:whatever.local pid:4729') AND failed_at IS NULL) 
ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING * 

आप किसी भी अन्य कोड के साथ समस्याओं पर ताला लगा है:

यहाँ डीजे एसक्यूएल मेरे लिए की तरह लग रहा है? आप दो रेल कंसोल सत्र चल रहा है और ऐसा करने की कोशिश की जा सकी:

कंसोल सत्र 1:

User.find(1).with_lock do sleep(10); puts "worker 1 done" end 

कंसोल सत्र 2:

User.find(1).with_lock do sleep(1); puts "worker 2 done" end 

प्रारंभ दोनों एक ही समय में उन और अगर 2 अंत से पहले 1, आपके पास लॉकिंग समस्या अधिक सामान्य है जो नौकरी में देरी कर रही है।

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