Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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 芹菜中的广播队列没有得到确认_Python_Python 3.x_Rabbitmq_Celery_Amqp - Fatal编程技术网

Python 芹菜中的广播队列没有得到确认

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

我有一个由烧瓶+芹菜+兔子MMQ控制器(客户端)组成的系统。有一些远程工作者连接到AMQP以获取任务

我希望多个工作人员从一个广播队列(称为
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。 如何确认一个任务以清空客户端广播队列,从而只有一个而不是多个