rabbitmq消息真的可以持久化吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq消息真的可以持久化吗相关的知识,希望对你有一定的参考价值。

参考技术A 可以,它默认会持久化到本地磁盘。所以数据不会丢失。1453857833 Windows C++ 超级简单封装,一个发送接口,一个接收接口,数据用vector<string>存放数据 参考技术B 痪一团糟涛钢旅行绕

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

【中文标题】当 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消息真的可以持久化吗的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ:消息持久化策略

RabbitMQ持久化

RabbitMQ持久化机制

RabbitMq-持久化

RabbitMQ 之持久化

RabbitMQ面试题:如何确保消息不丢失? --- 2022-04-03