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

问题描述

我已经了解了 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 服务器可以获得来自消费者的确认。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...