Ruby on rails 带有EventMachine和Rails的RabbitMQ

Ruby on rails 带有EventMachine和Rails的RabbitMQ,ruby-on-rails,daemon,rabbitmq,eventmachine,ruby-on-rails-3.2,Ruby On Rails,Daemon,Rabbitmq,Eventmachine,Ruby On Rails 3.2,我们目前正在计划使用RabbitMQ的rails 3.2.2应用程序。我们希望运行几种工作程序(以及一个工作程序的几个实例)来处理来自不同队列的消息。workers是用ruby编写的,放在rails应用程序的lib目录中 有些工作人员需要rails框架(活动记录、活动模型…),有些则不需要。应每分钟呼叫第一个工作人员以检查更新是否可用。当消息(由第一个工作人员发送)出现时,其他工作人员应该处理队列中的消息,并对其执行一些(耗时的)操作 到目前为止,一切顺利。我的问题是,我对RabbitMQ这样的

我们目前正在计划使用RabbitMQ的rails 3.2.2应用程序。我们希望运行几种工作程序(以及一个工作程序的几个实例)来处理来自不同队列的消息。workers是用ruby编写的,放在rails应用程序的lib目录中

有些工作人员需要rails框架(活动记录、活动模型…),有些则不需要。应每分钟呼叫第一个工作人员以检查更新是否可用。当消息(由第一个工作人员发送)出现时,其他工作人员应该处理队列中的消息,并对其执行一些(耗时的)操作

到目前为止,一切顺利。我的问题是,我对RabbitMQ这样的消息传递系统几乎没有经验,对它们之间的rails交互也没有经验。所以我想知道最好的做法是什么,让这两个玩对方。以下是我的要求:

  • Rails 3.2.2应用程序
  • 兔子
  • 几类工人
  • 一个工人的几个例子
  • 控制脱离轨道的工人数量
  • 工作人员正在执行耗时的任务,因此他们必须是异步的
  • 只有少数工人需要rails框架。其他的只是ruby文件,具有一些依赖项,如Net或File
我在寻找一些解决方案,并提出了两种可能性:

在新线程中将amqp与EventMachine一起使用

当然,我不希望我的rails应用程序在创建新工人时被阻止。辅助线程应在另一个线程中运行,并异步执行其工作。而且,它不应该启动rails应用程序的新实例。它应该只需要工人需要的东西

但在一些文章中,他们说,乘客存在一些问题。我不喜欢的另一个事实是,我们正在使用webbrick进行开发,我们也应该包括解决方法。可以切换到其他Web服务器,如thin,但我也没有这方面的经验

使用某种后台监控

也许可以将workers作为守护进程运行,但我不知道这会带来多少开销,也不知道如何控制worker的数量


希望有人能为这个问题提供一个好的解决方案(我希望我说得很清楚;)

在我看来,AMQP是解决您问题的一个大法宝。你试过使用Resque吗?备份的Redis数据库具有一些整洁的功能(如发布/订阅和阻止列表弹出),这使得它作为消息队列非常有趣,并且Resque在任何Rails应用程序中都非常容易使用

工作线程被守护,您可以决定池中的哪个工作线程侦听哪个队列,因此可以根据需要扩展每种类型的作业

不建议在请求/响应周期内使用EM reactor,因为它可能会与现有的事件循环冲突(例如,如果您的应用程序由thin提供服务),在任何情况下,您都必须专门为您的web服务器配置EM reactor,否则可能会有一个事件队列使用者,如果作业具有阻塞IO且未绑定处理器


如果仍要使用AMQP执行此操作,请参阅并相应地配置web服务器。或者用于在队列中同步推送(以及您使用的任何作业使用者,例如workling)

我们运行的技术堆栈略有不同,但相似

守护程序工具包用于系统的eventmachine端。。。没有rails,但是共享模型(mongomapper和mongodb)。EM正在从队列中提取消息,并执行所需的任何逻辑(我们在混合中使用了ruleby,但如果其他方法也有效的话)

mulesoft ESB是我们面向外部的消息接收方和发送方,帮助我们处理HL7/MLLP世界。但在应用程序的v1中,我们在ActiveMQ中使用了一些java代码来管理HL7消息


然后,rails应用程序只提供给用户看的东西——同样,使用共享模型。

我也在做同样的事情,还没有找到好的答案,希望有人能看到。我也希望如此;)如果你发现了一些有用的信息或者解决方案,请告诉我