免费在 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 上运行?