2

我们目前正在计划使用RabbitMQ的rails 3.2.2应用程序。我们想运行几种工人(和一些工人的实例)来处理来自不同队列的消息。工作人员用ruby编写,并放置在rails应用程序的lib目录中。带EventMachine和Rails的RabbitMQ

一些工作人员需要rails框架(活动记录,活动模型...),而其中一些则不需要。应该每分钟致电第一名工作人员检查是否有更新。当消息(由第一个工作人员发送)出现时,其他工作人员应该处理来自队列中的消息,并执行一些(耗时的)工作。

到目前为止,这么好。我的问题是,我只有像RabbitMQ这样的消息传递系统的经验,并且没有使用它们之间的导轨交互的经验。所以我想知道最好的做法是让这两个人一起玩。下面是我的要求再次:

  • 的Rails 3.2.2应用
  • 的RabbitMQ
  • 几类工人的
  • 一个工人的几个实例
  • 控制工人的数量从轨道
  • 工人们正在做耗时的任务,所以他们必须是异步的
  • 只有少数员工需要rails框架。其他人都只是红宝石文件中包含净某些依赖或文件

我一直在寻找一些解决方案,并与两种可能想出了:

在一个新的线程使用AMQP与EventMachine的

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

但是在一些文章中他们说Passenger有一些问题。另一个我不喜欢的事实是,我们正在使用webbrick进行开发,我们也应该包括这方面的解决方法。有可能切换到另一个像瘦的网络服务器,但我也没有任何经验。

使用某种daemonizing

也许它可以运行工人作为一个守护进程,但我不知道这会有多大的开销拿出,否则我怎么能控制工人的数量。

希望有人可以建议应该是一个很好的解决方案(我希望我自己清楚;)

+0

我工作的同样的事情,还没有找到一个很好的答案,希望有人会看到这一点。 – 2012-04-09 14:58:09

+0

我也希望如此);如果你找到一些有用的信息,甚至解决方案,请告诉我 – 23tux 2012-04-13 07:25:42

回答

1

在我看来,这是AMQP的大人物杀死你的问题。你有没有试过使用Resque?支持的Redis数据库具有一些整洁的功能(如发布/订阅和阻止列表弹出窗口),使其成为消息队列非常有趣,并且Resque在任何Rails应用程序中都非常容易使用。

工作人员被守护进程,并且您可以决定哪个工作人员监听哪个队列,以便根据需要调整每种工作类型。

不建议在请求/响应周期内部使用EM reactor,因为它可能与现有的事件循环冲突(例如,如果您的应用程序由精简服务),无论如何您必须专门为您的Web配置它服务器,OTOS,如果你的作业阻塞IO并且不受处理器限制,那么拥有一个队列消费者可能会很有趣。

如果您仍然想要使用AMQP,请参阅Starting the event loop and connecting in Web applications并相应地为您的Web服务器进行配置。或者使用bunny在队列中同步推送(以及您所使用的任何工作消费者,例如workling)

0

我们正在运行稍有不同 - 但类似的技术堆栈。

守护进程套件用于系统的eventmachine一侧...没有轨道,但共享模型(mongomapper & mongodb)。 EM正在将消息从队列中拉出来,并且执行任何所需的逻辑(我们已经在规则中做了规定,但if-then-else也可以)。

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

Rails应用程序,然后只是提供了工具和用户看到 - 再次,使用共享的模型。