Java rabbitMQ从2个队列中消耗

Java rabbitMQ从2个队列中消耗,java,design-patterns,queue,rabbitmq,spring-amqp,Java,Design Patterns,Queue,Rabbitmq,Spring Amqp,我必须编写重载系统,任务相当简单。因此,我决定将此任务拆分为位于不同位置(或云)的多个工作人员。为了通信,我想使用rabbitmq队列 在我的系统中,将有两种软件节点:调度器和工作者。调度器将从队列输入中获取用户输入,将其拆分为较小的任务,并将此较小的任务放入工作者队列。工人们阅读这个队列并“做这件事”。我在这里使用了round robbin负载平衡,只要有工人崩溃,所有的工作都很好。然后我散播了关于任务完成的信息(不允许一个操作执行两次,每个任务包含50次迭代,使用不同的数据执行工作者代码)

我必须编写重载系统,任务相当简单。因此,我决定将此任务拆分为位于不同位置(或云)的多个工作人员。为了通信,我想使用rabbitmq队列

在我的系统中,将有两种软件节点:调度器和工作者。调度器将从队列输入中获取用户输入,将其拆分为较小的任务,并将此较小的任务放入工作者队列。工人们阅读这个队列并“做这件事”。我在这里使用了round robbin负载平衡,只要有工人崩溃,所有的工作都很好。然后我散播了关于任务完成的信息(不允许一个操作执行两次,每个任务包含50次迭代,使用不同的数据执行工作者代码)

我考虑了一些类似于TeaQueQueQue-的另一个通道到调度器工作者的通信,我想知道,如何以一种好的方式来设计它。我使用了rabbitmq页面中的教程,因此我的工作线程如下所示:

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

我如何处理第二个队列?另一个线程是while(true){}loop?,或者有更好的解决方案吗?也许我应该在主题交换中重用现有队列?(但我希望在处理任务时有独立的通信方式,这可能需要一些时间。

您可能应该看看()。我不想告诉您添加一个层,但spring库负责线程问题和线程的管理。每个容器都进入一个队列,您可以指定线程的数量(即工人)每队

或者,您可以使用
ExecutorService
创建自己的服务,但最终可能会重写
SimpleMessageListenerContainer
的功能。此外,您还可以执行(通过操作系统或批处理脚本)更多的进程,从而为每个队列添加更多的使用者

就队列拓扑而言,它完全依赖于业务逻辑/关注点,通常较少依赖于性能需求。通常情况下,出于业务原因,您有更多的队列,出于性能原因,您有更多的工作人员,但如果使用相同类型的消息备份队列,则考虑将该类型的消息指定为自己的队列。您认为呢您的描述听起来像是工作队列上有多个消费者的两个队列


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

我建议您创建第二个队列使用者

consumer1 -> queue_process
consumer2 -> queue_process
两个使用者都应该监听同一个队列。
问候我希望能有所帮助

好吧,这就是我正在做的……此外,我在亚马逊云中的不同服务器上有相当多的用户进程。我必须考虑的问题是,与master异步通信的可能性——例如,告诉他,worker正在使用id 1001执行任务,其进度为20/50(40%)。此进度应按主要求发送。因此,我可能需要另一个问题-第一个问题已经很忙,任务很多。