1

当您生成消息并在未声明队列或在 basic_publish 中提及它的情况下发送消息时,消息存储在哪里(在 rabbit 中)?我必须使用的代码如下所示:

... bunch of setup code (no queue declaring tho)...
channel.exchange_declare(exchange='name', type='direct')
channel.basic_publish(exchange='exch_name', routing_key='rkey', body='message' )
conn.close()

我已经通过网络查看了我的能力,但还没有找到答案。我有一种预感,只要这条消息没有被消费,兔子就会创建一个队列,我担心如果兔子必须声明这个队列然后销毁它几个(数千!?)每分钟/小时的次数。

4

1 回答 1

1

当您发布时,您(通常)发布到交易所,就像您正在做的那样。交换决定如何处理该消息。如果与消息无关,则将其丢弃。如果与消息有关,则相应地对其进行路由。

在没有声明队列的原始代码片段中,消息将被丢弃。

正如您在评论中所说,生产者创建了一个队列。这里有一些您没有说明的选项。我将尝试通过各种可能性。通常你会在消费者中声明队列。但是,如果您希望确保他们的消费者看到所有消息,则队列必须由生产者创建并由生产者绑定到交换器,以确保每条消息最终都在此队列中。然后当队列被消费者消费时,它将看到所有的消息。或者,您可以使用命令行或管理 gui 从代码外部将队列创建为非自动删除队列,也可能作为持久队列(即使重新启动 RabbitMQ 也会保留队列)。

队列和交换不是持久的,它们是否持久,这意味着它们将在重启 RabbitMQ 后存在。队列具有自动删除功能,因此当消费者与它们断开连接时,它们将不再存在。

消息可以是持久的,因此如果您将消息发送到将被路由到队列的交换器,则不会读取该消息并且重新启动 RabbitMQ 消息将在重新启动时仍然存在。即使消息不是持久的,如果队列不是持久的,那么它也会丢失,或者如果消息没有首先路由到队列。

确保在创建队列后,使用与消息路由键相同的键将队列正确绑定到交换器。

于 2012-08-20T13:12:16.423 回答