【问题标题】:How can I run a loop process on a Heroku instance (Rails 4)?如何在 Heroku 实例(Rails 4)上运行循环进程?
【发布时间】:2015-04-29 00:42:56
【问题描述】:

我有一个 Heroku Rails 4 应用程序,我希望它可以连续运行。它正在处理来自 Amazon SQS 的数据。

现在,我使用 clock.rb 不断添加延迟作业来运行工人。工人设置为运行 10m,然后完成。由于 clock.rb 每 30 秒运行一次,它应该会很快重新启动一个新进程。

我的 Procfile 是:

myworker: QUEUE=myworker bundle exec rake jobs:work

我想知道是否有办法改变 Procfile,这样我就可以说“myworker 的每个实例都应该在它还活着的时候运行这个进程。如果它由于某种原因而死,请立即重新启动它并开始处理再次"

有没有使用 Rails 4 和 Heroku 的好方法?

一定有……我真的不知道这叫什么,但肯定有这个名字。

另外,一旦我让它运行,是否有一种好方法可以说“每 10m 关闭一次进程,然后重新启动,只是为了清除你的内存/重新启动”?

【问题讨论】:

  • 您看过 EventMachine 或 Sidekiq 吗?不完全确定您要做什么,但它们可能会有所帮助。
  • 我认为应该有一种方法可以在没有任何延迟作业的情况下运行它。我只是希望它是“启动这个实例并让它 100% 运行这个进程,不需要任何队列或延迟作业”

标签: ruby-on-rails ruby-on-rails-4 heroku


【解决方案1】:

您不必使用延迟作业或类似的东西来做这件事;你只需要创建一个自定义的 Rake 任务。

例如,在我的工作中,我们的 Procfile 中有这一行:

jobs_worker: bundle exec rake poll_jobs

我们在lib/tasks 中添加了一个file_jobs.rake 文件,它是这样做的:

task poll_jobs: :environment do while true puts "polling jobs" FileJob.poll_status! sleep 10 end end

我们设置了额外的 sleep 10 以便替换任务不会立即启动。但你可以把它拿出来。您的任务完成后,它将自动重新启动。请记住,如果您经常重新启动,Heroku 可能会生您的气,并且不会再次启动您的任务。

您可以轻松地在其中放置一个计时器,或者“您在循环中的次数” - 并在计时器到期时退出,或者您通过循环的次数大于'x'。

这有意义吗?

【讨论】:

  • 是的,我得试试。
  • 酷 - 我刚刚注意到那里有一个 while true 组件;我们有这个,所以我们的进程“永远”运行 - 你可以偶尔退出你的进程(但不要像我警告的那样频繁,如果你经常重启你的进程,Heroku 可能会生气)。还要知道,如果您的进程崩溃或内存溢出,Heroku 会为您杀死它,然后他们会立即重新启动它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多