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

Posted

技术标签:

【中文标题】当 rabbitmq-server 崩溃时,rabbitmq 服务器会恢复标记为持久队列的消息吗?【英文标题】:Will rabbitmq server recover messages for queue marked as durable, when rabbitmq-server gets crashed? 【发布时间】:2018-09-21 01:00:32 【问题描述】:

我正在浏览Rabbitmq官方网站给出的AMQP的documentation。 它说

队列持久性 持久队列被持久化到磁盘,因此可以存活 经纪人重新启动。不持久的队列称为瞬态队列。不是 所有场景和用例都要求队列是持久的。

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

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

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

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

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

提前致谢。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

你可以参考链接,包含持久和非持久消息之间的区别? 队列非持久且消息类型持久时会发生什么? 一旦消息被路由到非持久队列,它就会从持久性日志文件中删除,不再被认为是持久性的。答案已更新。

以上是关于当 rabbitmq-server 崩溃时,rabbitmq 服务器会恢复标记为持久队列的消息吗?的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS 更新后 Rabbitmq 无法找到 erl

允许 RabbitMQ-Server 连接

输入路径不存在:hdfs://localhost:9000/user/rab/input

在 RHEL 上安装 rabbitmq-server

每日打卡5

当活动崩溃时会发生啥?