是否可以免费在Heroku上运行延迟作业?
我正在尝试在Heroku上使用delayed_job_active_record
。但是,它需要一个worker dyno
,如果我把这个dyno打开全职,这将花费金钱。
我认为使用Unicorn并让其工作人员延迟工作而不是Heroku工作人员,在成功运行所有工作的同时不会花费任何成本。但是,Unicorn工作人员似乎并没有自动开始“工作”。
我的 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
这样的宝石来免费在Heroku上运行延迟的工作? (reference)
答案 0 :(得分:15)
像这样拆分这个过程可能会产生问题 - 你最好的选择就是不要试着去免费使用它。但是使用像http://hirefireapp.com/这样的东西,当有工作要做的时候就会启动工人,从而大大降低成本,而不是全天候运行工人。
另请注意,Heroku只会自动启动网络'进程,启动其他命名进程是一个手动任务。
答案 1 :(得分:6)
您可以使用Heroku Scheduler使用命令
运行作业rake jobs:workoff
这样,作业可以在您的网络动态中运行。根据{{3}},此命令将运行所有可用作业并退出。
例如,您可以将调度程序配置为每10分钟运行一次此命令,并且当没有作业排队时,它对应用程序的性能没有明显影响。另一个好主意是安排它以较低的访问率每天运行。
答案 2 :(得分:5)
理想情况下,没有直接获得免费的方法,但你可以找到很多可以享受免费后台工作的解决方法。其中一个是http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/
此外,如果您计划使用resque,这是后台工作的绝佳选择,您将需要redis,免费提供纳米版本=> https://addons.heroku.com/redistogo。 https://devcenter.heroku.com/articles/queuing-ruby-resque
简单的解决方案是为工人购买一个dyno,而你的网络dyno将是免费的。
如果您需要更多帮助,请告诉我。
由于
答案 3 :(得分:2)
考虑使用Workless gem:https://github.com/lostboy/workless
答案 4 :(得分:1)
如果你只有一个网络工作者,如果Heroku处于非活动状态一小时,它就会睡觉。
此外,Heroku将每天至少重启一次所有dynos。
这使得内部ruby调度程序很难做到。它必须至少使用持久存储(例如数据库)。