【问题标题】:Running a continuous running worker process on Heroku在 Heroku 上运行一个持续运行的工作进程
【发布时间】:2012-09-30 15:50:30
【问题描述】:

在 Heroku 上运行连续工作进程的最佳方式是什么?我的应用程序需要这个进程 24/7 运行,所以delayed_job 或其他队列似乎有点矫枉过正。我可以通过 Heroku 控制台手动触发该过程,并且可以将其分离并自行运行。

最好,我只想将这个单一方法调用分配给一个测功机,这样当我的应用程序启动时,它会启动额外的 worker-dyno,然后调用我的单一方法并开始嗡嗡作响。但不确定如何分配该方法调用?

我可以使用延迟工作,它可以解决所有问题,但似乎我需要一个立即(调用时)而不是计划的独特活动。但也许这是唯一的方法。

【问题讨论】:

  • 您能否举例说明这个长期运行的过程可能会做什么?
  • @ThomasKlemm 这是一个服务器状态应用程序,所以进程正在监控多个应用程序并频繁发出 HTTP 请求。
  • 频繁的 HTTP 请求可能会让您选择 Sidekiq 作为后台工作人员而不是延迟作业,当与像 this special one 这样的线程安全 HTTP 客户端结合使用时,这可能会以非阻塞方式执行它们。也就是说,我将在下面发布一个答案,它可能会更符合您的要求。

标签: ruby-on-rails heroku


【解决方案1】:

在您的 Procfile 中,您可以为额外的工人工作添加一个单独的进程

# Procfile
web: ...
worker: ...
collector: bundle exec ruby stats_collector.rb -p $PORT # or any other command

然后您可以使用$ heroku ps:scale collector=1 扩展此过程。它将单独运行,并在每次部署时停止并重新启动。我想说的是,您的应用程序所做的事情必须是安全的,可以随时被中断以使用如此长时间运行的进程。

如果中断可能导致问题(例如,您只想完成一次的事情在重新启动后会执行两次),则使用“传统”后台工作程序,例如Sidekiq 将消息排队可能是更安全的解决方案。

更新

如果您想在 Rails 应用程序的上下文中以非交互方式执行长时间运行的代码,可以使用 rails runner 命令。

# Procfile
web: ...
worker: ...
collector: bundle exec rails runner 'MyModel.my_long_running_job'

【讨论】:

  • 我认为这会很完美。我的worker进程可以处理多个线程的HTTP请求,而这个命令,我想,正是我一直在寻找的!
  • 让收集器开始工作,但很难从我的应用程序中调用 Class.method。只调用一个 ruby​​.rb 文件(在您的示例中为 stats_collector),只运行该文件中的代码(不知道任何其他类),还是我遗漏了什么?
  • 我认为包括rails runner 在内的更新可以帮助您。请报告是否成功。
  • 从未尝试过 rails runner,而是将调用放入我在收集器中使用的 rake 任务中。调试 Heroku 工作程序是一项挑战,但现在它就像一个魅力。谢谢。
  • @januszm 这里的收集器进程只是一个具有自定义、非标准进程名称的测功机。它将被视为所有测功机/流程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2013-06-28
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多