Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python RabbitMQ:一次多个队列/一个(长)任务_Python_Rabbitmq - Fatal编程技术网

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

Python RabbitMQ:一次多个队列/一个(长)任务,python,rabbitmq,Python,Rabbitmq,我使用RabbitMQ来管理多个执行长期任务的服务器。每个服务器都可以侦听一个或多个队列,但每个服务器一次只能处理一个任务 每次启动服务器中的使用者时,我都会使用channel.basic_qosprefetch_count=1对其进行配置,以便只为相应队列处理一个任务 假设我们有: -2个队列:任务1、任务2。 -2台服务器:服务器1、服务器2。 -这两台服务器都使用task1和task2 如果同时生成下一条消息: -任务1的消息a -任务2的消息B -任务1的消息C 我所期望的是: -mes

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

每次启动服务器中的使用者时,我都会使用channel.basic_qosprefetch_count=1对其进行配置,以便只为相应队列处理一个任务

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

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

我所期望的是: -messageA由server1处理 -messageB由server2处理 . messageC保持排队状态,直到其中一台服务器准备就绪并完成其当前任务

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

我不会同时启动消费者。事实上,每个服务器中的工作任务都在不断地打开/关闭。大多数时间服务器都使用不同的队列server1:tasks1、tasks2、task3;服务器2:任务1,任务5;服务器3:任务2,任务5;等等

我怎样才能做到这一点

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


我尝试使用带有路由密钥的交换,但发现了两个问题:绑定到路由密钥任务的所有服务器我将处理其任务我只需要处理一次,如果没有绑定到任务的服务器,然后它的消息将被丢弃。我需要保持排队状态,直到某个服务器能够处理它。

从您提供的描述中可以看出,问题是由于您的服务器同时连接到多个队列

当您的预回迁计数设置为1时,连接到3个队列的服务器将消耗最多3条消息,即使按照您的处理描述,他一次只处理一条消息

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

是否所有服务器都使用所有任务 您是否需要能够停止某些任务的处理 如果您需要/希望能够停止某些任务的处理,或控制整个服务器的处理分布,则需要管理服务器中的使用者,以便一次只有一个活动使用者,否则由于预回迁1,您将阻止/使用某些消息


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

感谢您的帮助Olivier。正如您所说,任何服务器都可以连接到多个队列,问题在于它实际上一次可以处理多个任务。通过使用单个队列,我发现问题在于每个任务都是不同的。task1任务与task2上的任务完全不同,只有能够处理task1的服务器才能处理它,而且只有一个。我尝试使用带有路由密钥的交换,但是绑定到路由密钥task1的每个服务器都会处理任务,我需要它只处理一次。我不需要停止处理。如果您只需要一台服务器来处理给定的队列/任务,您可能有兴趣将您的使用者定义为独占?我只需要一台服务器来处理每个任务,但将有许多服务器能够处理它。我的意思是:tasks1的messageA应该只由一台服务器处理,但可能有3或4台服务器在侦听tasks1,其中任何一台都可以选择处理它。从您希望设置的逻辑来看,似乎您可以更轻松地为消息执行GET,而不是使用消息使用者。然后,您可以在各个队列中循环,并在继续循环之前处理任何可用的事件。这可以避免您遇到的预回迁问题,但代码方面当然有点重,因为您需要测试get是否返回某些内容。如何为消息执行get而不是使用消息使用者?你能再解释一下吗?谢谢