2

我可以在 Web 服务器内运行延迟作业或类似的计划框架,例如。瘦还是独角兽?如果是,我该如何启动它?(代码示例会很酷!)

原因是我想在我的应用程序正处于构建阶段并且它托管在 heroku 上时省钱。

4

3 回答 3

3

正式

不,不支持在 Web 框架内异步运行 delay_jobs 的方式。从有关运行作业的文档来看,运行作业的唯一受支持方式似乎是运行 rake 任务或延迟的作业脚本。此外,弯曲机架服务器(旨在处理传入的客户端请求)以支持将任务从某个队列中拉出,这在概念上似乎是错误的。

杂牌

也就是说,我知道省钱有时胜过概念上的完美。看看这些 rake 任务。我的任务是在您的 Rails 服务器中创建一个特殊的端点,您可以定期从某个远程位置访问该端点。在此端点内,实例化 aDelayed::Worker并使用选项调用.startexit_on_complete。这样,您将不需要新的测功机或命令。

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

编辑

使用spawnDelayed::Worker gem,您可以用块包装您的实例化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
于 2013-02-18T17:29:48.333 回答
1

这是一个类似问题的链接:

在 Heroku dyno 上运行多个进程是否可行?

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

以类似的方式,您可能会研究:

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

在构建应用程序时节省对多个网络测功机的需求(尽管它仍然受到上述关闭问题的影响)。

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

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

设置好后,很容易部署到。Heroku 为您省去了 devops 部分。

于 2013-02-18T16:53:34.523 回答
0

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

https://gist.github.com/brauliobo/11298486

于 2015-05-14T23:36:06.563 回答