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

Will rabbitmq server recover messages for queue marked as durable, when rabbitmq-server gets crashed?

我正在查看 Rabbitmq 官方网站提供的 documentation AMQP。 它说

Queue Durability Durable queues are persisted to disk and thus survive broker restarts. Queues that are not durable are called transient. Not all scenarios and use cases mandate queues to be durable.

Durability of a queue does not make messages that are routed to that queue durable. If broker is taken down and then brought back up, durable queue will be re-declared during broker startup, however, only persistent messages will be recovered.

但是当 Message broker 崩溃时,我对以下情况感到困惑:-

  1. 消息由生产者传递到 Message Exchange,但未路由到标记为持久的队列。
  2. 消息由生产者传递到 Message Exchange,后者又路由到标记为持久的队列,但消息在队列中并且未被消费者使用。
  3. 消息由生产者传递到 Message Exchange,后者又路由到标记为持久的队列,但是消息在队列中并被消费者消费,但消费者没有向队列发送确认。

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

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

提前致谢。

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

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

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

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

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