我正在开发一个 Rails 3.2.16 应用程序并部署到一个 Heroku 开发帐户,其中包含一个免费的网络测功机,没有工作人员测功机。我正在尝试确定是否真的需要(付费)工人测功机。
该应用程序发送各种电子邮件。我使用delayed_job_active_record 将它们排队并将它们发送出去。
我还需要每分钟检查一次通知计数。为此,我正在使用 rufus-scheduler。
rufus-scheduler 似乎能够在Heroku web dyno 中运行后台任务/线程。
另一方面,我在delayed_job 上可以找到的所有内容都表明它需要一个单独的工作进程。为什么?如果 rufus-scheduler 可以在 web dyno 中运行守护进程,那么为什么延迟作业不能这样做呢?
我已经测试了以下内容来运行我的每分钟任务并处理 delay_jobs,它似乎可以在单个 Heroku web dyno 中工作:
配置/初始化程序/rufus-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 将在一小时后空闲一个不活动的网络测功机。我还没有设置它,但是让我们假设我正在使用各种保持活动的方法之一来防止它进入睡眠状态: 防止 Heroku 空闲的简单方法?.