19

是否可以免费在 Heroku 上运行延迟作业?

我正在尝试delayed_job_active_record在 Heroku 上使用。但是,它需要一个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 工作人员来完成延迟工作吗?

我是否必须使用 gemworkless来免费在 Heroku 上运行延迟作业?(参考

4

5 回答 5

15

像这样拆分流程可能会导致问题 - 你最好的选择是不要尝试让它“免费”,而是使用http://hirefireapp.com/之类的东西,当有工作要执行时,它会启动一个工人,从而显着降低成本而不是 24x7 运行工人。

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

于 2013-03-04T08:39:45.353 回答
6

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

rake jobs:workoff

这样作业可以在您的网络测功机中运行。根据Delayed_Job docs,此命令将运行所有可用的作业并退出。

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

于 2015-09-25T14:56:57.663 回答
5

理想情况下,没有直接的方法可以免费获得此功能,但您会发现许多解决方法可以让您享受免费的后台工作。其中之一是http://nofail.de/2011/07/heroku-cedar-background-jobs-for-free/

此外,如果您打算使用 resque,它是后台作业的绝佳选择,您将需要 redis,它随 nano 版本免费提供 => https://addons.heroku.com/redistogohttps://devcenter.heroku.com/articles/queuing-ruby-resque

简单的解决方案是为工人购买一个测功机,而您的网络测功机将是免费的。

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

谢谢

于 2013-03-04T08:14:09.357 回答
2

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

于 2014-05-12T03:49:18.263 回答
1

如果你只有一个 web worker,Heroku 会在它处于非活动状态一小时后将其休眠。

此外,Heroku 每天至少会重启一次所有测功机。

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

于 2013-11-15T21:00:13.027 回答