2012-02-13 2 views
7

현재 Ruby 1.9.2 및 Resque가있는 Rails 3.0 프로젝트가 있습니다.Resque : 대기열 당 하나의 작업자

내 응용 프로그램에는 런타임에 동적으로 작성되는 여러 개의 작업자 클래스와 여러 대기열이 있습니다. 또한, 다수의 근로자가 시작 시간에 기존 대기열이 없기 때문에, 어떤 대기열에 작업이 없는지 시작이 있고, 그들은 예측할 수 없습니다 :

$ COUNT=3 QUEUE=* rake resque:workers 

큐 상기 project 년대를 기반으로 생성 id :

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

주어진 대기열의 경우 해당 작업은 한 번에 하나씩 순서대로 처리해야합니다. 내 문제는 여러 근로자를 보유함으로써 여러 작업이 병행 처리된다는 것입니다.

대기열 당 최대 작업자 수를 1로 설정하는 방법이 있습니까? 작업이 처리되는 동안 대기열을 잠그는 방법이 있습니까?

감사합니다.

답변

2

나는 마침내 resque 다시 시도와 레디 스에 저장 잠금 (I가 사용자를 위해이 일을하고, 단지 프로젝트를 위해 그것을 할)를 사용하여 아주 간단한 해결책에 온 : 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,하지만 저를 위해 일하지 않습니다. 대기열은 런타임에 생성됩니다. –