RabbitMQ消息持久化机制

上一篇说到生产者消息确认机制,它可以确保消息投递到RabbitMQ的队列中,但是消息发送到RabbitMQ以后,如果MQ宕机,也可能导致消息丢失,所以提出了消息持久化。持久化的主要机制就是将信息写入磁盘,当RabbtiMQ服务宕机重启后,从磁盘中读取存入的持久化信息,恢复数据。而持久化机制又可以分为:

  • 交换机持久化
  • 队列持久化
  • 消息持久化

在上一篇的案例代码中,我们故意把交换机的durable设置为false,队列的durable为true。

这里说一下另外两个参数:

  • exclusive:排他队列。如果一个队列被声明为排他队列,那么这个队列只能被第一次声明他的连接所见,并在连接断开的时候自动删除。这里有三点需要说明:
    • 排他队列是基于连接可见的,同一连接的不同信道是可以同时访问同一连接创建的排他队列
    • 如果一个连接已经声明了一个排他队列,其他连接是不允许建立同名的排他队列的,这个与普通队列不同
    • 即使该队列是持久化的,一旦连接关闭或者客户端退出,该排他队列都会被自动删除的,这种队列适用于一个客户端发送读取消息的应用场景
  • autoDelete:自动删除,如果该队列没有任何订阅的消费者的话,该队列会被自动删除。这种队列适用于临时队列

当重启MQ服务后发现交换机已被销毁,而队列还存在,这是符合我们预期的。

我们在SpringBoot项目中使用spring-boot-starter-amqp 声明的交换机、队列、消息默认都是持久化的。而交换机和队列的持久化从上述代码中可以看到是通过指定durable的值。

在SpringBoot中使用rabbitTemplate.convertAndSend发送消息时

在做消息转换的时候,我们注意到,传入了一个MessageProperties对象。

在MessageProperties中,有个deliveryMode属性,该属性默认值为:MessageDeliveryMode.PERSISTENT(持久化的)

但是要明白即便交换机、队列、消息都设置持久化,也不能保证消息100%不丢失。因为有可能RabbitMQ接收到了消息,但是还没来得及持久化到磁盘,他自己就宕机了,这个时候消息还是会丢失的。

可以考虑生产者在发送消息时在数据库中写入消息日志,但是在后期消息补发的时候就需要人工介入,将失败的消息捞出来然后重新发送。只要消息数据在,即便MQ宕机了也只是补数据的事。

也可以单独起一个定时任务,周期性的去将这些失败存储的消息进行重发。如果你的MQ服务故障后几分钟就恢复了,那么重试的时候消息就能够成功发出去了。

下一篇聊一聊消费者手动ACK。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
回答: RabbitMQ持久化机制涉及到producer端的确认机制、broker端的镜像队列的配置以及consumer端的确认机制。为了确保消息的可靠性,RabbitMQ提供了持久化消息的功能。首先,producer端可以通过确认机制来确保消息成功发送到RabbitMQ。其次,broker端可以配置镜像队列,即在多个节点上保存消息的副本,以提高高可用性。当master节点发生故障时,可以自动切换到slave节点,从而保证消息的可靠性。然而,即使配置了镜像队列,如果整个集群都挂掉,仍然无法完全保证RabbitMQ不丢失消息。但是相比没有镜像队列的情况下,配置了镜像队列可以提供更好的消息可靠性。\[1\]\[3\]此外,还需要注意的是,消息在正确存入RabbitMQ之后,还需要一段时间才能存入磁盘中。在这段时间内,如果RabbitMQ broker发生crash,消息可能只保存在cache中而没有来得及落盘,从而导致消息丢失。为了解决这个问题,可以采用其他机制,如设置持久化模式或者使用事务来确保消息持久化。\[2\] #### 引用[.reference_title] - *1* *2* *3* [RabbitMQ持久化机制](https://blog.csdn.net/fly910905/article/details/122872692)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LoneWalker、

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值