Ruby on rails 什么';在Rails中组织工作进程的最佳方法是什么?

Ruby on rails 什么';在Rails中组织工作进程的最佳方法是什么?,ruby-on-rails,queue,backgroundworker,Ruby On Rails,Queue,Backgroundworker,我经常有一些代码应该按计划运行,或者作为带有一些参数的后台进程运行。常见的元素是它们在分派过程之外运行,但需要访问Rails环境(可能还有传入的参数) 组织这项活动的好方法是什么?为什么?如果您喜欢使用特定的插件或gem,请解释为什么您觉得它很方便——不要只列出您使用的插件。对我来说,不想维护大量额外的基础设施是一个关键优先事项,因此我使用了在Rails之外运行的数据库支持队列 就我而言,我使用了和。使用background\u作业,工作进程通过cron保持运行,因此没有守护进程管理。由于工作延

我经常有一些代码应该按计划运行,或者作为带有一些参数的后台进程运行。常见的元素是它们在分派过程之外运行,但需要访问Rails环境(可能还有传入的参数)


组织这项活动的好方法是什么?为什么?如果您喜欢使用特定的插件或gem,请解释为什么您觉得它很方便——不要只列出您使用的插件。

对我来说,不想维护大量额外的基础设施是一个关键优先事项,因此我使用了在Rails之外运行的数据库支持队列

就我而言,我使用了和。使用
background\u作业
,工作进程通过cron保持运行,因此没有守护进程管理。由于工作延迟,我正在使用Heroku,让他们担心这一点

使用delayed_作业,您可以根据后台工作人员运行所需的数量传入参数

Delayed::Job.enqueue(MyJob.new(param[:one], param[:two], param[:three])
除了通过cron使用
script/runner
(我更喜欢在Rake任务上使用
script/runner
,因为我发现测试代码更容易),我还没有找到一个好的解决方案来按计划运行东西

我从未有过需要访问特定Rails请求的定期安排的后台进程,所以这不是一个太大的问题


我知道还有其他更酷的系统具有更多的功能,但这对我来说效果不错,并帮助我避免设置许多新的服务进行管理。

我有一个系统接收请求,然后需要使用web服务调用多个外部系统。其中一些请求的等待时间比用户预期的要长,我使用企业队列系统(activemq)来处理这些请求

我正在使用插件来做这件事。这允许我对请求进行马歇尔处理,并将其放置在队列中进行异步处理,以访问请求数据,但是如果要等待响应,则需要编写轮询服务


我见过Ryan Bates railscast,它们看起来很有前途,但我没有使用它们。

对于定期安排的任务,我只使用rake任务。它简单、易于测试、易于理解,并且与Rails环境集成良好。然后,只需按照您所需的时间间隔使用cron作业执行这些rake任务(我用来管理这些作业,因为我对cron有点不了解)。

我真的不喜欢为了运行异步作业而保留到数据库中的gem,如
延迟的\u作业
后台的\u作业
。在我看来,这简直太脏了。暂时的东西不属于数据库

我非常喜欢使用消息队列来处理异步任务,即使您不需要大规模的可伸缩性。在我看来,消息队列是复杂系统的理想“通用语言”。对于消息队列,在大多数情况下,您对正在构建的任何消息队列所涉及的技术或语言都没有限制。在“enterprisey”环境中,低并发消息队列使用率的好处可能最为明显,在这种环境中,集成始终是一个巨大的难题。此外,当异步工作流涉及多个步骤时,消息队列非常理想。兔子是我个人的最爱

例如,考虑构建搜索引擎的场景。人们可以提交要编制索引的URI。显然,您不希望在请求中检索和索引页面。因此,您围绕一个消息队列进行构建:表单提交目标获取URI,将其扔到要编制索引的消息队列中。下一个可用的spider进程从队列中弹出URI,检索页面,查找所有链接,如果未知,则将每个链接推回到队列中,并缓存内容。最后,一条新消息被推送到第二个队列中,供索引器进程处理缓存的内容。索引器进程将消息从队列中弹出,并对缓存的内容进行索引。当然过于简单化了——搜索引擎需要做很多工作,但你明白了

至于实际的守护进程,显然,我偏爱我自己的库(ChainGang),但它实际上只是Kernel.fork()的一个包装器,为您提供了一个方便的地方来处理安装和拆卸代码。它还没有完全完成。实际上,守护进程远没有消息队列重要

关于Rails环境,这可能最好留给读者作为练习,因为内存使用将是长期运行进程的一个重要因素。你不想加载任何你不需要加载的东西。顺便说一句,这是DataMapper对ActiveRecord的一个有力打击。环境初始化是有很好的文档记录的,并且使用的依赖项少了很多,这使得整个工具包和堆都非常现实

关于cron+rake,我不喜欢的一点是,实际上rake保证打印到标准输出,如果cron作业生成输出,cron往往过于健谈。我喜欢将所有cron任务放在一个适当命名的目录中,然后制作一个包装它们的rake任务,这样手动运行它们就很简单了。rake这样做是很遗憾的,因为我更愿意选择利用依赖关系。在任何情况下,您只需将cron直接指向脚本,而不是通过cron运行脚本


我目前正在构建一个非常依赖异步进程的Web应用程序,我不得不说,我非常非常高兴我决定不使用Rails。

出于好奇,您决定使用什么?西纳特拉,DATAMAPER,XAPIAN,RabbitMQIt听起来您在体系结构上花费的时间比大多数人愿意花费的时间要多得多,或者您的应用程序比通常的应用程序要复杂得多。想法?实际上我可能不会这么说。应用程序i