我可以在 Web 服务器内运行延迟作业或类似的计划框架,例如。瘦还是独角兽?如果是,我该如何启动它?(代码示例会很酷!)
原因是我想在我的应用程序正处于构建阶段并且它托管在 heroku 上时省钱。
我可以在 Web 服务器内运行延迟作业或类似的计划框架,例如。瘦还是独角兽?如果是,我该如何启动它?(代码示例会很酷!)
原因是我想在我的应用程序正处于构建阶段并且它托管在 heroku 上时省钱。
不,不支持在 Web 框架内异步运行 delay_jobs 的方式。从有关运行作业的文档来看,运行作业的唯一受支持方式似乎是运行 rake 任务或延迟的作业脚本。此外,弯曲机架服务器(旨在处理传入的客户端请求)以支持将任务从某个队列中拉出,这在概念上似乎是错误的。
也就是说,我知道省钱有时胜过概念上的完美。看看这些 rake 任务。我的任务是在您的 Rails 服务器中创建一个特殊的端点,您可以定期从某个远程位置访问该端点。在此端点内,实例化 aDelayed::Worker
并使用选项调用.start
它exit_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
这是一个类似问题的链接:
请记住,正如帖子所说,如果您只使用一个网络测功机,如果没有流量,它将被关闭。
以类似的方式,您可能会研究:
http://blog.codeship.io/2012/05/06/Unicorn-on-Heroku.html
在构建应用程序时节省对多个网络测功机的需求(尽管它仍然受到上述关闭问题的影响)。
我建议您可以直接在 VPS 上运行,而不是 Heroku(查看 railscast):
http://railscasts.com/episodes/337-capistrano-recipes
设置好后,很容易部署到。Heroku 为您省去了 devops 部分。
您可以在 Unicorn 的单独工作进程中运行它,因此它与主进程共享内存并与应用程序一起重新启动。