2012-02-13 60 views
7

我目前有一個Rails 3.0項目,包含Ruby 1.9.2和Resque。Resque:每個隊列有一名工人

我的應用程序有多個工作者類和多個隊列,它們是動態創建的(在運行時)。此外,還有多個工人開始是自由地在任何隊列工作,因爲在啓動時不存在任何現有的隊列,他們無法預測:

$ 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,謝謝!你的問題與我的問題非常相似,所以我很快就會看看你的解決方案。 – 2012-06-07 20:39:55

1

我想到的第一個解決方案是在另一個工作人員輪詢同一隊列時,檢查是否有任何工作人員在給定隊列中工作。這可以通過重新實現Resque::Job.reserve(queue)來完成:

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 2012-04-04 18:49:28

+0

解決方案比這更復雜,我決定只和一名工人一起去保證我的狀況。每當表演成爲問題時,我都會擔心! :P – 2012-05-14 11:03:28

1

Resque-pool可以幫助您指定每個隊列的工人數量。

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

+0

感謝Nick,但是這對我並不奏效,因爲我的隊列是在運行時創建的。 – 2012-06-07 20:35:41