Heroku上的rufus-scheduler和delayed_job:为什么要使用工作器dyno?

时间:2014-04-10 19:47:47

标签: ruby-on-rails-3 heroku delayed-job rufus-scheduler

我正在开发一个Rails 3.2.16应用程序,并使用一个免费的网络dyno和没有工作人员dynos部署到Heroku开发帐户。我试图确定是否真的需要(付费)工人dyno。

该应用会发送各种电子邮件。我使用delayed_job_active_record对它们进行排队并将它们发送出去。

我还需要每分钟检查一次通知计数。为此,我使用rufus-scheduler。

rufus-scheduler似乎能够在 Heroku web dyno中运行后台任务/线程

另一方面,我在delayed_job上找到的所有内容都表明它需要一个单独的工作进程。为什么?如果rufus-scheduler可以在web dyno中运行一个守护进程,为什么delay_job可以做同样的事情呢?

我已经测试了以下运行我的每分钟任务处理delayed_jobs,并且它似乎在单个Heroku网络dyno中运行:

配置/初始化/鲁弗斯-scheduler.rb

require 'rufus-scheduler'
require 'delayed/command'

s = Rufus::Scheduler.singleton
s.every '1m', :overlap => false do # Every minute
  Rails.logger.info ">> #{Time.now}:  rufus-scheduler task started"
  # Check for pending notifications and queue to delayed_job
  User.send_pending_notifications
  # work off delayed_jobs without a separate worker process
  Delayed::Worker.new.work_off  
end

这似乎很明显,我想知道我是否遗漏了什么?这是否是一种可接受的方式来处理delayed_job队列,而不会增加单独的工作进程的复杂性和费用?

更新

正如@jmettraux指出的那样,Heroku将在一小时后闲置一个不活动的网络dyno。我还没有设置它,但是我们假设我使用了各种保持活动方法之一来防止它进入睡眠状态:Easy way to prevent Heroku idling?

1 个答案:

答案 0 :(得分:1)

根据这个

https://blog.heroku.com/archives/2013/6/20/app_sleeping_on_heroku

如果他没有提供一小时的服务请求,你的dyno会进入睡眠状态。没有dyno,没有安排。

这也有帮助:https://devcenter.heroku.com/articles/clock-processes-ruby