rabbitMQ消耗2个队列

时间:2013-07-23 14:23:55

标签: java design-patterns queue rabbitmq

我必须编写重载系统,这很容易完成。所以我决定将这些任务分成不同位置(或云)的多个工作人员。要沟通我想使用rabbitmq队列。

在我的系统中,将有两种软件节点:调度程序和工作程序。调度程序将从queue_input获取用户输入,将其拆分为较小的任务,并将此较小的任务放入workers_queue。工人读这个队列并“做事”。我在这里使用了循环负载平衡 - 所有工作都很顺利,只要一些工人崩溃了。然后我松开了有关任务完成的信息(不允许两次执行单个操作,每个任务包含一组50次迭代,使用不同的数据执行工作代码)。

我认为像techn_queue这样的东西 - 调度员 - 工作者沟通的另一个渠道,我想知道如何以一种好的方式设计它。我使用了rabbitmq页面的教程,所以我的工作线程看起来像:

while(true) {
   message = consume(QUEUE,...);
   handle(message); //do 50 simple tasks in loop for data in message
}

我如何处理第二个队列?我们有一段时间(真实){}循环?,或者有更好的解决方案吗?也许我应该重用现有队列与主题交换? (但我想在处理任务时有独立的沟通方式,这可能需要一些时间。

2 个答案:

答案 0 :(得分:1)

你应该看看doc)。我不想告诉你添加一个图层,但是spring库负责处理线程问题和线程管理SimpleMessageListenerContainer。每个容器都进入队列,您可以为每个队列指定#个线程(即工作者)。

或者,您可以使用ExecutorService制作自己的,但最终可能会重写SimpleMessageListenerContainer的内容。此外,您只需执行(通过操作系统或批处理脚本)更多进程,这将为每个队列添加更多的使用者。

就队列拓扑而言,它完全依赖于业务逻辑/关注点,而且通常较少依赖于性能需求。更常见的是,出于业务原因,出于性能原因,您有更多的队列,但是如果队列使用相同类型的消息进行备份,则考虑将该类型的消息作为其自己的队列。您的描述听起来像是 worker 队列中有多个使用者的两个队列。

除了线程问题和队列拓扑外,我还不完全确定你还在问什么。

答案 1 :(得分:0)

我建议你创建第二个队列消费者

consumer1 -> queue_process
consumer2 -> queue_process

两个消费者都应该听同一个队列。 我希望有帮助的问候