2013-06-13 28 views
5

Tôi có nhân viên Resque thường không mất nhiều thời gian hơn khoảng 1-5 phút để chạy, nhưng thường những công nhân đó sẽ bị "kẹt" và không hoạt động, làm tắc nghẽn công nhân và không làm gì cả.Thường xuyên thanh tẩy công nhân khôi phục cũ trên Heroku?

Vì vậy, tôi muốn thường xuyên kiểm tra các công nhân đã chạy lâu hơn X và thanh lọc chúng. Nhưng tôi cần phải làm điều này tự động, vì vậy tôi không phải đích thân đi vào và tự xóa chúng (Resque.workers.each {|w| w.unregister_worker}) vài giờ một lần.

Điều này cần phải hoạt động trên Heroku.

+0

Khoảng thời gian từ khi một nhân viên bắt đầu một chỉ báo đáng tin cậy bị kẹt? Tôi cho rằng 1-5 phút là thời lượng của một công việc. Nhưng nếu công việc tiếp tục đến, một công nhân có thể chạy mãi mãi và không bị "mắc kẹt". Vâng? Tôi hỏi vì tôi có cùng một vấn đề và tôi muốn có một cách đáng tin cậy để xóa tắc nghẽn. –

Trả lời

5

Đặt này thành một nhiệm vụ rake:

allocated_time = 60 * 60 # 1 hour 
Resque::WorkerRegistry.working.each do |worker| 
    if (worker.started <=> Time.now - allocated_time) < 1 
    worker.unregister 
    end 
end 

Sử dụng Heroku lên lịch, bạn có thể đặt nó ở mức tối thiểu là 10 phút nếu đó dãy phòng.

+0

Điều này chỉ hiển thị với Resque 2, là những người đang sử dụng tính năng này trong sản xuất ngay bây giờ? Ấn tượng của tôi từ README là bạn không nên sử dụng nó. – opsb

+0

Có vẻ như worker.started sẽ cho bạn biết khi nào người lao động được đăng ký ban đầu - KHÔNG làm việc trong công việc hiện tại trong bao lâu. Vì vậy, đây không phải là thử nghiệm chính xác để biết liệu một nhân viên có bị mắc kẹt hay không. Xem [câu trả lời này] (http://stackoverflow.com/a/21560463/629636) để biết phương thức truy xuất thời gian bắt đầu của công việc hiện tại. –

0

Đối Resque v1,

# lib/tasks/clear_stale_workers.rake 
namespace :clear do 
    desc 'Clearing stuck workers ...' 
    task :stale_workers => :environment do 
    Resque.workers.each do |w| 
     w.unregister_worker unless w.started > 1.hour.ago 
    end 
    end 
end 

Từ dòng lệnh, rake clear:stale_workers

On Heroku, thiết lập các bộ scheduler để chạy nhiệm vụ Rake này.

0

Điều này đã giúp tôi xóa những công nhân cụ thể đang chạy công việc cũ. Bạn có thể thêm nó vào một công việc cào.

Resque::Worker.working.each{|w| w.done_working } 
Các vấn đề liên quan