2014-07-16 20 views
7

Tôi gặp sự cố khi sử dụng các dynos để chạy nhiều quy trình công việc của công việc bị trì hoãn.Làm thế nào để bạn chạy nhiều công nhân DelayedJob trên một dyno Heroku duy nhất?

My Procfile trông như thế này:

worker: bundle exec script/delayed_job -n 3 start 

delayed_job kịch bản của tôi là mặc định được cung cấp bởi các đá quý:

#!/usr/bin/env ruby 

require File.expand_path(File.join(File.dirname(__FILE__), '..', 'config', 'environment')) 
require 'delayed/command' 
Delayed::Command.new(ARGV).daemonize 

Khi tôi cố gắng chạy mạng cục bộ hoặc một Dyno Heroku nó thoát khỏi âm thầm và tôi không thể biết chuyện gì đang xảy ra.

foreman start 
16:09:09 worker.1 | started with pid 75417 
16:09:15 worker.1 | exited with code 0 
16:09:15 system | sending SIGTERM to all processes 
SIGTERM received 

Bất kỳ sự giúp đỡ với một trong hai cách để gỡ lỗi các vấn đề hoặc gợi ý về những cách khác để đi về việc chạy nhiều công nhân trên một Dyno duy nhất nó sẽ được đánh giá rất nhiều.

Trả lời

12

Bạn có thể sử dụng quản đốc để bắt đầu nhiều quy trình trên Dyno cùng.

Đầu tiên, thêm người quản đốc vào Gemfile của bạn.

Sau đó, thêm một dòng worker để bạn Procfile:

worker: bundle exec foreman start -f Procfile.workers 

Tạo một file mới có tên gọi Procfile.workers chứa:

dj_worker: bundle exec rake jobs:work 
dj_worker: bundle exec rake jobs:work 
dj_worker: bundle exec rake jobs:work 

Đó sẽ bắt đầu 3 công nhân delayed_job trên của bạn công nhân dyno.

0

Câu trả lời ngắn gọn là bạn không thể thực hiện việc này với delay_job. Một dyno là một quá trình và một nhân viên delay_job duy nhất hoạt động trên một tiến trình đơn lẻ.

Có các giải pháp khác cho điều này. Nếu bạn có thể chuyển sang sử dụng Sidekiq thì bạn có thể chạy khá một vài công nhân trên một quy trình duy nhất vì công nhân Sidekiq sử dụng luồng. Sự cân bằng ở đây là công nhân của bạn sẽ cần phải là chủ đề an toàn.

Check it out: http://sidekiq.org/

5

Hãy thử thay đổi Procfile của bạn để:

worker: bundle exec script/delayed_job -n 3 run

Sử dụng start sẽ tạo ra hai daemon trong nền và sau đó thoát ra ngay lập tức. Heroku nghĩ rằng quá trình của bạn bị rơi.

Sử dụng run giữ cho người lao động ở nền trước.

CẬP NHẬT: Tôi sử dụng Delayed Job Worker Pool cho việc này ngay bây giờ.

+0

Cảm ơn lệnh 'run'! – dgilperez

+0

Có, đã được tìm kiếm trên tất cả cho việc này. Đây sẽ là câu trả lời được chấp nhận. –

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