在主Web进程中运行delayed_job

时间:2013-02-18 16:37:53

标签: ruby-on-rails scheduled-tasks

我可以在Web服务器内部运行delayed_job或类似的计划框架,例如。薄或独角兽? 如果是,我该如何开始呢? (代码示例会非常酷!)

原因是我想在我的应用程序中存钱只是在构建阶段而且它是在heroku上托管的。

3 个答案:

答案 0 :(得分:3)

正式

不,没有支持的方式在Web框架内异步运行delayed_jobs。从documentation正在运行的作业来看,运行作业的唯一支持方式似乎是运行rake任务或延迟作业脚本。此外,弯曲设计用于处理传入客户端请求的Rack服务器在概念上似乎是错误的,以支持从某个队列中拉出任务。

The Kludge

那就是说,我明白省钱有时胜过概念上的完美。看看these rake tasks。我的kludge是在您的Rails服务器中创建一个特殊端点,您可以定期从某个远程位置点击该端点。在此端点内,使用Delayed::Worker选项实例化.start并在其上调用exit_on_complete。这样,您就不需要新的dyno或命令。

请注意,这是一种kludgy解决方案,它将占用您的一个rails进程,直到所有延迟的作业完成。这意味着除非您有其他rails进程,否则所有传入请求都将阻塞,直到此队列请求完成。 Unicorn提供了生成工作进程的工具。此解决方案是否有效还取决于您的工作以及运行时间和应用程序的延迟容差。

修改

使用spawn gem,您可以使用Delayed::Worker块包装spawn的实例化,这将导致您的作业在单独的进程中运行。这意味着您的rails进程可以立即提供Web请求,而不是在运行延迟作业时阻止。但是,spawn gem对ActiveRecord有一些依赖,我不知道你正在使用什么DB / ORM。

这是一些示例代码,因为它变得有点模糊:

class JobsController < ApplicationController
  def run
    spawn do
      @options = {} # youll have to get these from that rake file
      Delayed::Worker.new(@options.merge(exit_on_complete: true)).start
    end
  end
end

答案 1 :(得分:1)

以下是类似问题的链接:

Is it feasible to run multiple processeses on a Heroku dyno?

请记住,正如帖子所说,如果你只使用一个网络dyno,如果没有流量,它将被关闭。

以类似的方式,你可能会看到:

http://blog.codeship.io/2012/05/06/Unicorn-on-Heroku.html

在构建应用程序时节省多个网络动态数据库的需求(尽管仍然存在上述关机问题)。

我建议您可以直接在VPS上运行,而不是Heroku(查看railscast):

http://railscasts.com/episodes/337-capistrano-recipes

设置完成后,部署起来非常简单。 Heroku为你削减了devops部分。

答案 2 :(得分:0)

您可以在Unicorn的单独工作程序中运行它,因此它与主进程共享内存并与应用程序一起重新启动。

请参阅https://gist.github.com/brauliobo/11298486