在Heroku免费运行延迟任务

19

如何在Heroku免费运行延迟作业?

我正在尝试在Heroku上使用delayed_job_active_record。然而,它需要一个worker dyno,如果我全天开启这个dyno,就需要花钱。

我想通过使用Unicorn并使其工作进程运行延迟作业来解决这个问题,这样就不需要花费任何费用,同时成功运行所有作业。但是,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 worker从0扩展到1时才能正常工作。再次问,是否不可能使用Unicorn工作进程来执行延迟作业而不是Heroku worker?
我是否必须使用像workless这样的宝石来免费在Heroku上运行延迟作业?(参考)

2
我使用workless gem。使用一个gem来帮助在需要时启动worker应该没有问题。它非常好用!;-) - mjnissim
5个回答

15
拆分这个过程可能会带来问题-最好的选择是不要尝试免费获取,而是使用像http://hirefireapp.com/这样的工具,在有任务需要执行时启动一个 worker,从而显著降低成本,而不是全天候运行一个 worker。此外,请注意,Heroku 只会自动为您启动“web”进程,启动其他命名进程是手动任务。

什么样的问题? - Zaz
我没有使用过它,但是workless gem看起来可以做与这些服务相同的事情:https://github.com/lostboy/workless - Luca Spiller
例如,在扩展Web和Worker Dynos之后,我必须运行'heroku rake jobs:work'吗?因为Heroku不会自动完成此操作。 - Shalafister's

6
你可以使用Heroku Scheduler来运行任务,使用命令即可。
rake jobs:workoff

这样,作业可以在您的Web dyno中运行。根据Delayed_Job文档,此命令将运行所有可用作业并退出。
您可以将调度程序配置为每10分钟运行此命令,例如,当没有作业排队时,它不会对应用程序的性能产生明显影响。另一个好主意是将其安排在每天访问率较低的时间运行。

如果后台工作程序将在主服务器进程中运行,那么它的意义是什么? - Adem Dinarević

5
理想情况下没有直接免费的方法,但可以找到许多变通方法来享受免费的后台作业,其中之一是使用Heroku Cedar 免费后台作业
如果你计划使用resque来进行后台作业,则需要redis,它随nano版本一起免费提供。=> https://addons.heroku.com/redistogohttps://devcenter.heroku.com/articles/queuing-ruby-resque 简单的解决方案是购买一个worker dyno,而你的web dyno则是免费的。
如果需要更多帮助,请告诉我。
谢谢。

2

1
如果你只有一个网络工作者,Heroku会在其不活动一小时后将其休眠。
此外,Heroku每天至少重新启动所有dynos。
这使得在Ruby中进行调度变得困难。它必须至少使用持久存储(例如数据库)。

2
可以防止Heroku进入空闲状态。安装免费的New Relic插件。它具有可用性监视器功能,每分钟会向您的站点发送两次ping请求,从而防止dyno进入空闲状态。 - narzero

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接