2013-03-04 33 views
18

Có thể chạy các công việc bị trì hoãn trên Heroku miễn phí không?Chạy các công việc bị trì hoãn trên Heroku miễn phí

Tôi đang cố gắng sử dụng delayed_job_active_record trên Heroku. Tuy nhiên, nó đòi hỏi một worker dyno và nó sẽ chi phí tiền nếu tôi bật dyno này cho toàn thời gian.

Tôi nghĩ sử dụng Unicorn và làm cho nhân viên của mình chạy các công việc bị trì hoãn thay vì nhân viên Heroku, sẽ không mất phí, trong khi chạy thành công tất cả các công việc. Tuy nhiên, công nhân Unicorn dường như không bắt đầu "làm việc" tự động.

Tôi có thông tin sau trong số Procfile.

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb 
worker: bundle exec rake jobs:work 

và sau đây trong tôi unicorn.rb

worker_processes 3 
timeout 30 
preload_app true 

before_fork do |server, worker| 
    # Replace with MongoDB or whatever 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.connection.disconnect! 
    Rails.logger.info('Disconnected from ActiveRecord') 
    end 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis.quit 
    Rails.logger.info('Disconnected from Redis') 
    end 

    sleep 1 
end 

after_fork do |server, worker| 
    # Replace with MongoDB or whatever 
    if defined?(ActiveRecord::Base) 
    ActiveRecord::Base.establish_connection 
    Rails.logger.info('Connected to ActiveRecord') 
    end 

    # If you are using Redis but not Resque, change this 
    if defined?(Resque) 
    Resque.redis = ENV['REDIS_URI'] 
    Rails.logger.info('Connected to Redis') 
    end 
end 

công việc bị trì hoãn chỉ dường như hoạt động khi tôi mở rộng người lao động Heroku từ 0 đến 1. Một lần nữa, là nó không thể sử dụng Unicorn công nhân thay vì Heroku công nhân để làm công việc bị trì hoãn?

Tôi có phải sử dụng đá quý như workless để chạy các công việc bị trì hoãn trên Heroku miễn phí không? (reference)

+2

Tôi sử dụng đá quý không làm việc. Sẽ không có vấn đề gì khi sử dụng đá quý để giúp nhân viên chỉ cháy khi cần thiết. Nó hoạt động một viên ngọc! ;-) – mjnissim

Trả lời

14

Splitting quá trình như vậy có thể phát sinh vấn đề - lựa chọn tốt nhất của bạn là nó không cố gắng và có được nó 'miễn phí' nhưng sử dụng một cái gì đó giống như http://hirefireapp.com/ đó sẽ khởi động một công nhân khi có công việc để thực hiện giảm chi phí đáng kể thay vì chạy một công nhân 24x7.

Cũng lưu ý, Heroku sẽ chỉ tự khởi động quy trình 'web' cho bạn, bắt đầu các quy trình được đặt tên khác là nhiệm vụ thủ công.

+0

+1 điều đó thực sự rất hữu ích. Cảm ơn! – abhijit

+0

Loại sự cố nào? – Zaz

+0

Tôi đã không sử dụng nó, nhưng đá quý không làm việc trông giống như các dịch vụ này: https://github.com/lostboy/workless –

5

Lý tưởng là không có cách nào để có được điều này miễn phí, nhưng bạn sẽ tìm thấy rất nhiều cách giải quyết có thể thực hiện để tận hưởng công việc nền miễn phí. Một trong số đó là http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

Ngoài ra nếu bạn có kế hoạch sử dụng resque là lựa chọn tuyệt vời cho các công việc nền bạn cần redis mà đi kèm với phiên bản nano =>https://addons.heroku.com/redistogo. https://devcenter.heroku.com/articles/queuing-ruby-resque

Giải pháp đơn giản là mua một dyno cho người lao động, trong khi đó, dyno web của bạn sẽ miễn phí.

Hãy cho tôi nếu bạn cần thêm trợ giúp.

Cảm ơn

1

Nếu bạn chỉ có một nhân viên web, Heroku sẽ ngủ nếu nó không hoạt động trong một giờ.

Ngoài ra, Heroku sẽ khởi động lại tất cả các dynos ít nhất một lần một ngày.

Điều này khiến việc lập lịch biểu trong ruby ​​trở nên khó khăn. Ít nhất phải sử dụng bộ nhớ liên tục (ví dụ: cơ sở dữ liệu).

+2

Người ta có thể ngăn chặn Heroku khỏi chạy không tải. Cài đặt tiện ích New Relic miễn phí. Nó có tính năng giám sát tính khả dụng sẽ ping trang web của bạn hai lần mỗi phút, do đó ngăn chặn dyno không hoạt động. – narzero

5

Bạn có thể sử dụng Heroku Scheduler để chạy các công việc bằng cách sử dụng lệnh

rake jobs:workoff 

Bằng cách này, công việc có thể chạy trong Dyno web của bạn. Theo Delayed_Job docs, lệnh này sẽ chạy tất cả các công việc có sẵn và thoát.

Bạn có thể định cấu hình trình lập lịch biểu để chạy lệnh này sau mỗi 10 phút, và nó không có hiệu lực hợp lý về hiệu suất của ứng dụng khi không có công việc nào được xếp hàng đợi. Một ý tưởng hay khác là lên lịch để chạy hàng ngày tại một thời điểm với tỷ lệ truy cập thấp hơn.

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