在Heroku上免费运行延迟的工作

是否可以免费在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的gem来免费在Heroku上运行延迟的工作? ( 参考 )

拆分这样的过程可能会产生问题 – 你最好的选择是不要尝试并免费获得它,而是使用像http://hirefireapp.com/这样的东西来启动一个工人,当有工作要做时显着降低成本而不是全天候运行工人。

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

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

 rake jobs:workoff 

这样,作业就可以在您的web dyno中运行。 根据Delayed_Job文档 ,此命令将运行所有可用作业并退出。

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

理想情况下,没有直接的方式来获得这个免费,但你会发现许多可以做的工作,以享受免费的后台工作。 其中一个是http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

此外,如果您计划使用resque,这是后台工作的绝佳选择,您将需要redis免费纳米版本=> https://addons.heroku.com/redistogohttps://devcenter.heroku.com/articles/queuing-ruby-resque

简单的解决方案是为工人购买一个dyno,而你的网络dyno将是免费的。

如果您需要更多帮助,请告诉我。

谢谢

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

如果你只有一个网络工作者,Heroku将在一小时内处于非活动状态时将其hibernate。

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

这使得内部ruby调度程序很难做到。 它必须至少使用持久存储(例如数据库)。