为什么发布者在Pika RabbitMQ中声明队列a?

Why does publisher declares queue a in Pika RabbitMQ?

我已经了解了 RabbitMQ 的基础知识。一件事我发现发布者不会直接在队列上发布。交换根据 routing-key 和交换类型决定消息应该发布到哪个队列(下面的代码使用默认交换)。我还找到了发布者的示例代码。

import pika, os, logging
logging.basicConfig()
# Parse CLODUAMQP_URL (fallback to localhost)
url = os.environ.get('CLOUDAMQP_URL', 'amqp://guest:guest@localhost/%2f')
params = pika.URLParameters(url)
params.socket_timeout = 5
connection = pika.BlockingConnection(params)
channel = connection.channel()
channel.queue_declare(queue='pdfprocess')
# send a message
channel.basic_publish(exchange='', routing_key='pdfprocess', body='User information')
print ("[x] Message sent to consumer")
connection.close()

在第 9 行中,正在声明队列。我有点困惑,因为发布者不必知道队列。例如,如果它使用扇出交换并且有 100 个不同名称的队列,消费者如何知道和声明 100 个队列?

消费者可以在连接到RabbitMQ时声明队列并将其绑定到交换器。 fanout exchange 然后将收到的消息复制并路由到绑定到它的所有队列,而不管路由键或模式匹配与直接和主题​​交换。

所以不,发布者不必知道绑定到交换器的所有队列。但是,发布者可以确保队列存在以确保代码运行顺利进行,但这对于其他交易所类型更为重要。

任何客户端(发布者或消费者)都可以在 RabbitMQ 中创建队列。有时您可能希望发布者创建一个队列,但对我而言,这通常是消费者的角色。发布者不需要知道它发送的任何东西在哪里,甚至是否会被消费。

例如,发布者可以从 RabbitMQ 服务器获得已收到消息的确认。当消息从队列中被消费时,RabbitMQ 服务器可以获得来自消费者的确认。

发布者无法确认何时从队列中使用消息,它不知道消息是路由到零个、一个或多个队列,还是从这些队列中使用。