RabbitMQ: 多队列/一次(长)任务

2024-04-23 18:50:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用RabbitMQ来管理多个执行长期任务的服务器。每个服务器可以侦听一个或多个队列,但每个服务器一次只能处理一个任务。在

每次我在服务器中启动一个使用者时,我都用channel.basic_qos(prefetch_count=1)来配置它,以便为相应的队列只处理一个任务。在

假设我们有: -2个队列:task1、task2。 -2台服务器:server1、server2。 -两台服务器都使用task1和task2。在

如果同时生成下一条消息: -任务1的消息A -任务2的消息B -任务1的消息C

我期望的是: -messageA由server1处理 -messageB由server2处理 . messageC将一直处于队列中,直到其中一个服务器准备就绪(完成当前任务)。在

我得到的是: -messageA由worker1处理 -messageB由worker2处理 -messageC被worker2处理(错误)

我不会同时启动消费者。事实上,每个服务器上的工作任务都在不断地打开/关闭。大多数情况下,服务器使用不同的队列(server1:tasks1、tasks2、task3;server2:tasks1、tasks5;server3:tasks2、tasks5等等)。在

我怎么能做到这一点?在

编辑 根据奥利弗的回答: 任务是不同的。每个服务器都能够处理一些任务,而不是全部任务。服务器一次只能处理一个任务。在

我尝试使用带有路由密钥的交换,但是我发现两个问题:所有绑定到路由密钥任务的服务器我都会处理它的任务(我只需要处理一次),如果没有绑定到任务的服务器,那么它的消息就会被丢弃(我需要保持排队直到某个服务器可以处理它)。在


Tags: 服务器消息队列rabbitmqserver1task1task2tasks1
1条回答
网友
1楼 · 发布于 2024-04-23 18:50:53

从您提供的描述来看,问题似乎是由于您的服务器同时连接到多个队列。在

当预取计数设置为1时,连接到3个队列的服务器将消耗多达3条消息,即使他一次只处理一条消息(根据您对处理的描述)。在

从您的问题中不清楚是否需要多个队列,或者是否可以将所有任务都放在一个队列中:

  • 所有任务都由服务器完成
  • 您是否需要能够停止某些任务的处理

如果您需要/希望能够“停止”某些任务的处理,或控制整个服务器的处理分布,则需要管理服务器中的使用者,使其一次只能有一个活动使用者(否则,由于预取1,您将阻止/使用一些邮件)。在

如果您不需要控制各种任务的处理,那么将所有消息都放在一个队列中,并为每个服务器预取一个单独的消费者到该队列设置中,会简单得多。在

相关问题 更多 >