2012-02-13 32 views
7

Tôi hiện có dự án Rails 3.0, với Ruby 1.9.2 và Resque.Resque: một công nhân cho mỗi hàng đợi

Ứng dụng của tôi có nhiều lớp công nhân và nhiều hàng đợi, được tạo động (trong thời gian chạy). Ngoài ra, có rất nhiều công nhân bắt đầu được miễn phí để làm việc trên bất kỳ hàng đợi, bởi vì lúc đầu không có bất kỳ hàng đợi hiện có, và họ không thể dự đoán:

$ COUNT=3 QUEUE=* rake resque:workers 

Queues một tạo ra dựa trên project 's id:

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

Đối với một hàng đợi nhất định, công việc của họ phải xử lý theo thứ tự và cùng một lúc. Vấn đề của tôi là, bằng việc có nhiều công nhân, nhiều công việc được xử lý song song.

Có cách nào để đặt số lượng công nhân tối đa cho mỗi hàng đợi (đến 1) không? Có cách nào để khóa hàng đợi trong khi công việc đang xử lý không?

Cảm ơn!

Trả lời

2

cuối cùng tôi đã đến một giải pháp khá đơn giản sử dụng resque-retry và khóa lưu trữ trong redis (Tôi đang làm điều này cho người sử dụng, chỉ cần làm điều đó cho các dự án): https://stackoverflow.com/a/10933666/745266

+0

Trông @lacco tốt, cảm ơn! Vấn đề của bạn thực sự giống như của tôi, vì vậy tôi chắc chắn sẽ xem xét giải pháp của bạn sớm. –

1

Giải pháp đầu tiên tôi nghĩ là kiểm tra xem có nhân viên nào làm việc trong một hàng đợi nhất định khi có một nhân viên khác bỏ phiếu cho cùng một hàng đợi đó không. Điều này có thể được thực hiện bằng cách thực hiện lại 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 

Sự cố có thể là điều kiện chủng tộc. Suy nghĩ?

+0

Did cuối cùng bạn đã đến một giải pháp, mã đã làm việc trong sản xuất? – lacco

+0

Giải pháp hóa ra phức tạp hơn nhiều và tôi quyết định chỉ đi cùng một công nhân để đảm bảo điều kiện của tôi. Bất cứ khi nào hiệu suất trở thành một vấn đề, tôi sẽ lo lắng về nó! : P –

1

Bể bơi có thể giúp bạn chỉ định số lượng công nhân trên mỗi hàng đợi.

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

+0

Cảm ơn Nick, nhưng điều đó không làm việc cho tôi, vì hàng đợi của tôi được tạo ra khi chạy. –

Các vấn đề liên quan