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

时间:2013-03-04 07:47:21

标签: ruby-on-rails heroku delayed-job

是否可以免费在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

5 个答案:

答案 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/redistogohttps://devcenter.heroku.com/articles/queuing-ruby-resque

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

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

由于

答案 3 :(得分:2)

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

答案 4 :(得分:1)

如果你只有一个网络工作者,如果Heroku处于非活动状态一小时,它就会睡觉。

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

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