Python 芹菜中的广播队列没有得到确认
我有一个由烧瓶+芹菜+兔子MMQ控制器(客户端)组成的系统。有一些远程工作者连接到AMQP以获取任务 我希望多个工作人员从一个广播队列(称为Python 芹菜中的广播队列没有得到确认,python,python-3.x,rabbitmq,celery,amqp,Python,Python 3.x,Rabbitmq,Celery,Amqp,我有一个由烧瓶+芹菜+兔子MMQ控制器(客户端)组成的系统。有一些远程工作者连接到AMQP以获取任务 我希望多个工作人员从一个广播队列(称为broadcasts\u tasks)中使用同一个任务,并异步回复另一个队列(称为response Queue)中的状态。根据回答,我发现工作人员接收任务的唯一方法是使用扇出交换,因此客户端是: CELERY_BROKER_URL='amqp://ubuntu:pwd@IP_ADDR/vhost', CELERY_QUEUES=( Queue(nam
broadcasts\u tasks
)中使用同一个任务,并异步回复另一个队列(称为response Queue
)中的状态。根据回答,我发现工作人员接收任务的唯一方法是使用扇出交换,因此客户端是:
CELERY_BROKER_URL='amqp://ubuntu:pwd@IP_ADDR/vhost',
CELERY_QUEUES=(
Queue(name="response-queue", exchange=recv_broadcast_exchange),
Broadcast(name='broadcast_tasks'),
),
根据回答,我在客户机和工作机上使用相同的配置。
通过使用rabbitmqctl list_队列
检查客户机,我看到了响应队列
,以及2个广播队列(一个用于客户机,一个用于工作者)
第一个问题:如果我理解正确,amqp会为每个节点创建一个新队列,那么像这样有两个广播队列可以吗
bcast.e1705111-75e0-4daa-8c20-7deaedc967d5 0 # for the worker
bcast.375fd2f6-200f-4b46-8b65-9bc5243623dd 0 # for the Client
response-queue 0
不是这样的:
broadcast_tasks 0
response-queue 0
后一种情况对我来说更合理
第二个问题:每次我重新启动客户端并添加新任务时,都会创建一个新的广播队列;作为type='fanout'
的广播交换,每个任务都被发送到所有队列,导致这种情况:
bcast.e1705111-75e0-4daa-8c20-7deaedc967d5 0 # for the worker
bcast.375fd2f6-200f-4b46-8b65-9bc5243623dd 2 # for the Client, old queue
bcast.d13fce7f-769f-4ad2-9ffe-228d979f7199 1 # for the Client, new queue after restart
response-queue 0
所以任务不会收到ACK,也不会过期,甚至设置RESULT\u PERSISTENT=False、TASK\u IGNORE\u RESULT=True、RESULT\u EXPIRES=5。
如何确认一个任务以清空客户端广播队列,从而只有一个而不是多个