2012-02-13 3 views
7

私は現在Ruby 1.9.2とResqueを持つRails 3.0プロジェクトを持っています。Resque:キューごとに1人の作業者

私のアプリケーションには、実行時に動的に作成される複数のワーカークラスと複数のキューがあります。また、複数の労働者は、開始時に既存のキューがないので、任意のキュー上で動作するように自由であることを始めたがある、と彼らは予測することはできません。

$ COUNT=3 QUEUE=* rake resque:workers 

キューproject年代に基づいて作成id:

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

特定のキューでは、ジョブを1つずつ順番に処理する必要があります。私の問題は、複数のワーカーを持つことによって、複数のジョブが並行して処理されることです。

キューごとのワーカーの最大数を1に設定する方法はありますか?ジョブの処理中にキューをロックする方法はありますか?

ありがとうございます!

答えて

2

私は最終的に(ちょうどプロジェクトのためにそれを行う、私はユーザーのためにこれをやっている)のRedisに保存されているresqueリトライやロックを使用して、非常に簡単な解決策に来た:https://stackoverflow.com/a/10933666/745266

+0

良いlaccoに見えます、ありがとう!あなたの問題は私のものと非常に似ていましたので、間もなくあなたのソリューションをすぐに見ていきます。 –

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

+0

解決策はそれよりはるかに複雑であることが判明し、私は自分の状態を保証するために一人の労働者と一緒に行くことに決めました。パフォーマンスが問題になるたびに、私はそれについて心配します! :P –

1

Resque-poolは、キューごとのワーカー数を指定するのに役立ちます。

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

+0

Nickさん、ありがとうございます。しかし、私のキューは実行時に作成されるので、それは私のために働きません。 –