2012-02-13 21 views
7

वर्तमान में रूबी 1.9.2 और रेस्क्यू के साथ एक रेल 3.0 परियोजना है।रेस्क्यू: एक कार्यकर्ता प्रति कतार

मेरे एप्लिकेशन में कई कार्यकर्ता वर्ग और एकाधिक कतार हैं, जो गतिशील रूप से बनाए गए हैं (रनटाइम के दौरान)। इसके अलावा, वहाँ कई कार्यकर्ताओं शुरू कर दिया है कि किसी भी कतारों पर काम करने के लिए स्वतंत्र हैं, वहाँ किसी भी मौजूदा कतारों नहीं है शुरू करने का समय पर क्योंकि हैं, और वे भविष्यवाणी नहीं की जा सकती है:

$ COUNT=3 QUEUE=* rake resque:workers 

कतार एक project के आधार पर बनाई गई आईडी:

@queue = "project_#{project.id}".to_sym 

एक दिया कतार के लिए, अपने काम करने के लिए एक समय में आदेश और एक में संसाधित किया है। मेरी समस्या यह है कि, कई श्रमिकों के साथ, समानांतर में कई नौकरियां संसाधित की जाती हैं।

क्या प्रति कतार (अधिकतम 1) श्रमिकों की अधिकतम संख्या निर्धारित करने का कोई तरीका है? नौकरी प्रसंस्करण करते समय कतार को लॉक करने का कोई तरीका है?

धन्यवाद!

उत्तर

2

मैं अंत में resque पुन: प्रयास और redis में संग्रहीत ताले (मैं उपयोगकर्ताओं के लिए यह कर रहा हूं, बस परियोजनाओं के लिए यह करना) का उपयोग कर एक काफी सरल समाधान के लिए आया था: https://stackoverflow.com/a/10933666/745266

+0

अच्छा लगता है @lacco, धन्यवाद! आपकी समस्या वास्तव में मेरी तरह ही थी, इसलिए मैं निश्चित रूप से जल्द ही आपके समाधान पर एक नज़र डालूंगा। –

1

पहला समाधान जो मैंने सोचा था, यह जांचना होगा कि क्या कोई कार्यकर्ता किसी कतार में काम कर रहा है या नहीं, जब एक और कार्यकर्ता उसी कतार को मतदान कर रहा है। यह Resque::Job.reserve(queue) reimplementing के द्वारा किया जा सकता है:

module Resque 
    class Job 

    def self.reserve(queue) 

     Resque::Worker.working.each do |worker| 
     # if already working in the same queue 
     if worker.job['queue'] == queue 
      return 
     end 
     end 

     return unless payload = Resque.pop(queue) 
     new(queue, payload) 
    end 

    end 
end 

एक संभावित मुद्दा रेस स्थिति होगी। विचार?

+0

क्या आप अंत में आ गया एक समाधान, कोड उत्पादन में काम किया था? – lacco

+0

समाधान उस से कहीं अधिक जटिल साबित हुआ और मैंने केवल एक शर्त के साथ एक शर्त के साथ जाने का फैसला किया। जब भी कोई समस्या बन जाती है, तो मैं इसके बारे में चिंता करूंगा! : पी –

1

रेस्क्यू-पूल आपको प्रति कतार श्रमिकों की संख्या निर्दिष्ट करने में मदद कर सकता है।

https://github.com/nevans/resque-pool

+0

धन्यवाद निक, लेकिन यह मेरे लिए काम नहीं करता है, क्योंकि मेरी कतार रनटाइम पर बनाई गई है। –

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