问题描述
我已经了解了 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 服务器可以获得来自消费者的确认。
发布者无法确认消息何时从队列中被消费,它不知道消息是路由到零、一个或多个队列,或者它们是否从这些队列中被消费。