当rabbitmq-server 崩溃时,rabbitmq 服务器会恢复标记为持久队列的消息吗?

Man*_*hit 4 amqp rabbitmq messagebroker

我正在浏览Rabbitmq 官方网站提供的 AMQP文档。它说

队列持久性持久队列被持久化到磁盘,因此在代理重启后仍然存在。不持久的队列称为瞬态。并非所有场景和用例都要求队列是持久的。

队列的持久性不会使路由到该队列的消息持久。如果broker被关闭然后又重新启动,则在broker启动期间会重新声明持久队列,但是,只会恢复持久消息。

但是,当消息代理崩溃时,我对以下情况感到困惑:-

  1. 消息由生产者传递到消息交换,但不会路由到标记为持久的队列。
  2. 消息由生产者传递到消息交换,然后再路由到标记为持久的队列,但消息在队列中,不被消费者消费。
  3. 消息由生产者传递到消息交换,然后再路由到标记为持久的队列,但消息在队列中并被消费者消费,但消费者没有向队列发送确认。

在上述所有情况下,下次启动 rabbit-mq 服务器时这些消息是否可用?

此外,文档区分了普通消息和持久消息,因为只有持久消息才会被恢复。两种消息类型有什么区别?

提前致谢。

Jes*_*man 7

代理重启后,持久队列将持续存在。这意味着在重新启动后,队列将自动重新创建,而无需您再次手动创建。这只能确保队列将继续存在,而不是它包含的任何消息。

现在,持久消息将在到达队列后立即写入磁盘,这与队列无关(持久与否)。

所以回答你的问题。如果您希望在重新启动后恢复您的消息,请始终将它们声明为持久的。假设这样,您的场景将是:

  1. 消息将丢失,因为它尚未到达队列。
  2. 消息将被恢复,因为它到达了队列。
  3. 消息将被恢复并在再次发送时(无论是向同一个消费者还是不同的消费者)再次发送,并带有重新交付的标志。这暗示消费者之前可能已经看过此消息。

请注意,持久消息在非持久队列中无效;当服务器重新启动时,不会重新创建队列,因此不会从持久性日志文件中重新创建消息。对于消息可能被路由到的每个非持久队列也是如此:一旦消息被路由到非持久队列,它就会从持久性日志文件中删除,不再被视为持久性。