Heroku上的rufus-scheduler和delayed_job:为啥要使用worker dyno?

Posted

技术标签:

【中文标题】Heroku上的rufus-scheduler和delayed_job:为啥要使用worker dyno?【英文标题】:rufus-scheduler and delayed_job on Heroku: why use a worker dyno?Heroku上的rufus-scheduler和delayed_job:为什么要使用worker dyno? 【发布时间】:2014-05-24 17:27:03 【问题描述】:

我正在开发一个 Rails 3.2.16 应用程序并部署到一个 Heroku 开发帐户,其中包含一个免费的网络测功机,没有工作人员测功机。我正在尝试确定是否真的需要(付费)工人测功机。

应用程序发送各种电子邮件。我使用delayed_job_active_record 将它们排队并将它们发送出去。

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

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

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

我已经测试了以下内容以运行我的每分钟任务处理延迟作业,它似乎在单个 Heroku 网络测功机中工作:

config/initializers/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 将在一个小时后空闲一个不活动的网络测功机。我还没有设置它,但让我们假设我正在使用各种保持活动的方法之一来防止它进入休眠状态:Easy way to prevent Heroku idling?。

【问题讨论】:

【参考方案1】:

据此

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

如果你的测功机一个小时没有处理请求,他将进入睡眠状态。没有测功机,没有调度。

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

【讨论】:

谢谢,我知道睡眠问题和时钟进程文章。我还没有设置它,但是让我们假设我正在使用各种保持活动的方法之一来防止它进入休眠状态:***.com/questions/5480337/…。我会更新问题。

以上是关于Heroku上的rufus-scheduler和delayed_job:为啥要使用worker dyno?的主要内容,如果未能解决你的问题,请参考以下文章

Heroku上的Python语言环境设置

Heroku 上的 Amazon S3 和 PHP

加快 Heroku 上的部署 [重复]

RabbitMQ 上的 Heroku、Django 和 celery

Heroku 上的 CodeIgniter 返回 404

heroku上的咕噜声和凉亭