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



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

队列

持久性 持久队列持久保存到磁盘,从而存活 代理重新启动。不持久的队列称为暂时性队列。不 所有场景和用例都要求队列持久。

队列的持久性不会使消息路由到该队列 队列持久。如果经纪人被撤下然后重新上台, 持久队列将在代理启动期间重新声明,但是,仅 持久消息将被恢复。

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

消息
  1. 由生成者传递到消息交换,但不路由到标记为持久的队列。
  2. 消息
  3. 由生产者传递到消息交换,而消息交换又路由到标记为持久的队列,但消息在队列中,不被使用者使用。
  4. 消息由生产者传递到消息交换,
  5. 而消息交换又路由到标记为持久的队列,但消息在队列中并由使用者使用,但使用者尚未向队列发送确认。

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

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

提前谢谢。

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

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

所以回答你的问题。如果您希望在重新启动后恢复邮件,请声明它们始终持久。假设您的方案将是:

  1. 邮件将丢失,因为它尚未到达队列。
  2. 邮件将被恢复,因为它到达了队列。
  3. 消息将被恢复,并在再次传递时再次
  4. 发送,并带有重新传递的标志(无论是传递给同一使用者还是不同的使用者)。这是消费者以前可能看过此消息的提示。

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

最新更新