RabbitMQ如何保证消息不丢

如何保证Queue消息能不丢呢?

RabbitMQ在接收到消息后,默认并不会立即进行持久化,而是先把消息暂存在内存中,这时候如果MQ挂了,那么消息就会丢失。所以需要通过持久化机制来保证消息可以被持久化下来。

队列和交换机的持久化

在声明队列的时候,可以通过设置durable 参数为true 来创建一个持久化队列,持久化队列会在Rabbitmq服务器重启后保留,确保队列的元数据不会丢失。

在声明交换器时,也可以通过设置durable参数为tue来创建一个持久化交换机,持久化交换机会在RabbitMQ服务器重启后保留,以确保交换机的元数据不好丢失。

绑定关系通常与队列和交换机相关联。当创建绑定关系时,还是可以设置durablue参数为true,以创建一个持久化绑定。持久化绑定关系会在服务器重启后保留,以确保绑定关系不会丢失。

 

持久化消息

生产者发送的消息可以通过设置消息的deliveryMode创建持久化消息。持久化消息在发送到持久化队列后,将在服务器重启后保留,以确保消息不会丢失。

deliveryMode 是一项用于设置消息传递模式的属性,用于指定消息的持久性级别。分别是有两个值

1.非持久化 这是默认的传递模式,如果消息被设置为非持久化,RabbitMQ将尽力将消息传递给消费者,但不会将其写入磁盘,这意味着如果RabbitMQ服务器在消息传递之前崩溃或重启,消息可能会丢失。

2.持久化 如果消息被设置为持久化,RabbitMQ会将消息写入磁盘,以确保即使在RabbitMQ服务器重启时,消息也不会丢失。持久化消息对于重要的消息非常有用,以确保它们不会再传递过程中丢失。

通过设置deliveryMode 类实现消息的持久化。但是需要注意,将消息设置为持久化会增加磁盘IO开销

消费者确认机制

有了持久化机制后,那么怎么保证消息在持久化下来之后一定能被消费者消费呢?

这里就涉及到消息的消息确认机制。

在RabbitMQ中,消费者处理消息成功后可以向MQ发送ack回执,MQ收到ack回执后才会删除该消息,这样才能确保消息不会丢失。如果消费者在处理消息中出现了异常,那么就会返回nack回执,MQ收到回执之后会重新投递一次,如果消费者一直都没有返回ACK/NACK的话,那么他也会在尝试重新投递。


无法做到100%不丢

虽然我们通过发送者端进行异步回调,MQ进行持久化,消费者做确认机制,但是也没办法保证100%不丢,因为MQ的持久化其实是异步的。即使我们开了持久化,也有可能在内存暂存成功后,异步持久化之前宕机了,那么这个消息就会丢失。

如果想要做到100%不丢失,就需要引入本地消息表,来通过轮询的方式来进行消息重投了。

相关推荐

  1. RabbitMQ如何保证消息

    2024-03-10 18:16:04       44 阅读
  2. RabbitMQ如何保证消息丢失?

    2024-03-10 18:16:04       51 阅读
  3. RabbitMQ 如何保证消息丢失

    2024-03-10 18:16:04       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 18:16:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 18:16:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 18:16:04       82 阅读
  4. Python语言-面向对象

    2024-03-10 18:16:04       91 阅读

热门阅读

  1. pytorch强化学习(2)——重写DQN

    2024-03-10 18:16:04       41 阅读
  2. 概率论与数理统计 P6 条件概率

    2024-03-10 18:16:04       40 阅读
  3. VUE2升级#总结1

    2024-03-10 18:16:04       45 阅读
  4. Pytho爬取音乐

    2024-03-10 18:16:04       38 阅读
  5. 计算机等级考试:信息安全技术 知识的四

    2024-03-10 18:16:04       44 阅读
  6. 非插件方式为wordpress添加一个额外的编辑器

    2024-03-10 18:16:04       37 阅读
  7. 算法练习第十二天|二叉树的递归遍历和迭代遍历

    2024-03-10 18:16:04       42 阅读
  8. 大数据架构

    2024-03-10 18:16:04       38 阅读
  9. typedef 别名的定义和使用

    2024-03-10 18:16:04       48 阅读
  10. springboot 下载 Excel 文件的 Controller 层案例

    2024-03-10 18:16:04       44 阅读
  11. AI辅助研发,引领科技新潮流

    2024-03-10 18:16:04       45 阅读