免费在 Heroku 上运行延迟作业

Posted

技术标签:

【中文标题】免费在 Heroku 上运行延迟作业【英文标题】:Running delayed jobs on Heroku for free 【发布时间】:2013-02-18 06:17:36 【问题描述】:

是否可以在 Heroku 上免费运行延迟作业?

我正在尝试在 Heroku 上使用 delayed_job_active_record。但是,它需要worker dyno,如果我全时打开这个测功机,它会花钱。

我认为使用 Unicorn 并让其工作人员运行延迟的工作而不是 Heroku 工作人员,在成功运行所有工作的同时不会花费任何成本。然而,独角兽工人似乎不会自动开始“工作”。

我的 Procfile 中有以下内容。

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

以及我的 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

延迟的工作似乎只有在我将 Heroku 工作程序从 0 扩展到 1 时才有效。 再说一遍,难道不能用 Unicorn 工人代替 Heroku 工人来做延迟的工作吗?

我是否必须使用像 workless 这样的 gem 在 Heroku 上免费运行延迟作业? (reference)

【问题讨论】:

我使用无用的宝石。仅在需要时使用宝石来帮助解雇工人应该没有问题。它是一颗宝石! ;-) 【参考方案1】:

这样拆分流程可能会导致问题 - 你最好不要尝试让它“免费”,而是使用 http://hirefireapp.com/ 这样的东西,当有工作需要执行时,它会启动一个工人,从而显着降低成本,而不是24x7 全天候运行工人。

另外请注意,Heroku 只会为您自动启动一个“网络”进程,启动其他命名进程是一项手动任务。

【讨论】:

什么样的问题? 我没用过,但是没用的 gem 看起来和这些服务一样:github.com/lostboy/workless 所以,例如在扩展 web 和 worker dynos 之后,我必须运行 'heroku rake jobs:work' 吗?因为不是 Heroku 做的【参考方案2】:

您可以使用Heroku Scheduler 使用命令运行作业

rake jobs:workoff

这样作业可以在您的网络测功机中运行。根据Delayed_Job docs,此命令将运行所有可用作业并退出。

例如,您可以将调度程序配置为每 10 分钟运行一次此命令,当没有作业排队时,它不会对应用程序的性能产生明显影响。另一个好主意是安排它在访问率较低的时间每天运行。

【讨论】:

如果要在主服务器进程中运行,那么后台工作人员的意义何在?【参考方案3】:

理想情况下,没有直接的方法可以免费获得此功能,但您会发现许多解决方法可以让您享受免费的后台工作。其中之一是http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

另外,如果您打算使用 resque,它是后台作业的绝佳选择,您需要使用 nano 版本免费提供的 redis => https://addons.heroku.com/redistogo。 https://devcenter.heroku.com/articles/queuing-ruby-resque

简单的解决方案是为工人购买一个测功机,而您的网络测功机将是免费的。

如果您需要更多帮助,请联系我。

谢谢

【讨论】:

【参考方案4】:

考虑使用 Workless gem:https://github.com/lostboy/workless

【讨论】:

【参考方案5】:

如果你只有一个 web worker,Heroku 会在它闲置一小时后休眠它。

此外,Heroku 将至少每天重启一次所有测功机。

这使得在 ruby​​ 内执行调度程序变得很困难。它至少必须使用持久存储(例如数据库)。

【讨论】:

可以防止 Heroku 闲置。安装免费的 New Relic 插件。它具有可用性监控功能,每分钟 ping 您的站点两次,从而防止测功机闲置。

以上是关于免费在 Heroku 上运行延迟作业的主要内容,如果未能解决你的问题,请参考以下文章

“无论何时” gem 在 Heroku 上运行 cron 作业

为啥我的 sidekiq 计划的 cron 作业没有在 heroku 上运行?

如何防止 Heroku 时钟测功机睡在免费套餐上?

在 Heroku 上运行 delay_job 工作者?

如何在 Ruby on Rails 中完成延迟作业后执行 ajax 回调?

您如何在单个 Heroku 测功机上运行多个 DelayedJob 工作人员?