2012-02-28 37 views
16

Tôi đang sử dụng delay_job và được chuyển đến một máy chủ beefier mới. Vì vậy, bây giờ tôi muốn chạy công việc song song, như bây giờ I have the POWER!, nhưng tôi bối rối về việc liệu delay_job có thể chạy nhiều hàng đợi song song?Delayed_job - Nhiều hàng đợi song song?

This question đề xuất rằng có hàng đợi được đặt tên, nhưng tất cả những điều này chạy ra khỏi một bảng và do đó tuần tự?

Ở dưới cùng @Jesse Wolgamott gợi ý rằng bạn có thể tạo bảng cho mỗi hàng đợi sau đó sẽ chạy song song.

Có ai đã làm điều này và họ có thể chỉ cho tôi cách thực hiện?

+0

Không, nhiều công nhân hoạt động song song không phải tuần tự. Ngay cả khi các hàng đợi là tất cả trong một bảng, công nhân sẽ sử dụng truy vấn sql để chọn hàng đợi công việc mà nó được gán cho, thứ tự bởi 'run_at',' priority'. Do đó nhiều công nhân có thể làm việc trên các phần khác nhau trong bảng đó song song. – lulalala

+0

Tôi quên câu trả lời, vì vậy tôi đã thêm vào những gì tôi sử dụng và chấp nhận nó. Tôi cũng upvoted khác ... – slotishtype

Trả lời

11

Với bundler trong sản xuất:

RAILS_ENV=production bundle exec script/delayed_job -n 4 start

hoặc không bundler

ruby script/delayed_job -n 4 start

+1

Tôi chưa thử tùy chọn -i nhưng tùy chọn -n dường như không hoạt động khi bạn đang chỉ định hàng đợi. Bạn sẽ nhận được nhiều công nhân đang chạy nhưng chỉ có một nhân viên sẽ áp dụng cho một chuỗi thực tế. – Dex

+0

"-n 4" - Đây là sai lầm lớn! Sử dụng -n4, không có không gian! Kéo dài vài giờ trên đó. –

+0

@AndrewRukin tài liệu hướng dẫn rõ ràng -n 2 (có khoảng trắng ...) xem tại đây: https://github.com/collectiveidea/delayed_job#running-jobs – rept

28

Có thể và tôi luôn làm việc đó. Trong trường hợp của chúng ta, chúng ta cần nhiều công việc để xử lý ba loại công việc khác nhau nói queue_a, queue_b và queue_c. Hệ thống sẽ tạo các mục trong bảng delay_job và hàng đợi có tên phù hợp.

Bắt đầu nhiều công ăn việc làm trì hoãn như

RAILS_ENV=production script/delayed_job -i first --queue=queue_a start 
RAILS_ENV=production script/delayed_job -i second --queue=queue_a start 
RAILS_ENV=production script/delayed_job -i third --queue=queue_b start 
RAILS_ENV=production script/delayed_job -i fourth --queue=queue_c start 

Mỗi lệnh sẽ tạo ra một delayed_job, vì vậy sẽ có doanh nghiệp 4 công việc song song, hai trong số họ phục vụ queue_a và một trong mỗi cho queue_b và queue_c. Điều quan trọng ở đây là số nhận dạng được chuyển qua tùy chọn -i chỉ định tên cá thể và chúng tôi có thể bắt đầu và dừng công việc theo yêu cầu.

Một tùy chọn khác là sử dụng nhóm công nhân.

RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start 

Lệnh đó sẽ bắt đầu 1 công nhân cho hàng đợi theo dõi, 2 công nhân cho người gửi thư và hàng công việc và 2 công nhân cho bất kỳ công việc nào.

+0

Bạn có biết, nếu người cuối cùng (2 công nhân cho bất kỳ công việc) cũng sẽ mất việc làm từ hàng đợi khác (theo dõi, bưu phẩm, nhiệm vụ) hoặc chỉ công việc mà không có hàng đợi được chỉ định? – Machisuji

+0

Tôi nghĩ rằng có một sự điều chỉnh cần thiết ở đây để xác định nhiều trường hợp. Cú pháp phải giống như RAILS_ENV = script sản xuất/delay_job --queue = queue_a -i one1 bắt đầu, chú ý khoảng cách giữa -i và tên instance. – 3coins

+0

Cảm ơn bạn, điều này đã làm việc rất tốt cho tôi ... cảm ơn! Tôi chưa kiểm tra tùy chọn -n ... – Gnana

3

Nếu bạn đang sử dụng nhiệm vụ cào như cơ chế phóng công việc của bạn, biến môi trường hàng đợi có thể được sử dụng để khởi chạy các công việc công nhân khác nhau được phân tách bằng hàng đợi.

Ví dụ:

QUEUE=email rake jobs:work 
QUEUE=build_data rake jobs:work 

Biến hàng đợi cho phép một dequeue từ nhiều hàng đợi DJ cho một công nhân nói riêng.

QUEUES=build_data,email rake jobs:work 

Đặc biệt hữu ích nếu bạn đang sử dụng môi trường lưu trữ trên máy chủ/đám mây (ví dụ: Heroku).

+0

Không hoạt động, nếu tôi đặt nhiều hàng đợi công việc song song như sau: 'QUEUES = build_data, email rake jobs: work' và sau đó' QUEUE = another_data rake jobs: work' –