rabbitmq如何保证消息不丢失_RabbitMQ中间件之如何通过持久化保证消息99.99%不丢失?...

本篇概要

要解决该问题,就要用到RabbitMQ中持久化的概念,所谓持久化,就是RabbitMQ会将内存中的数据(Exchange 交换器,Queue 队列,Message 消息)固化到磁盘,以防异常情况发生时,数据丢失。

其中,RabblitMQ的持久化分为三个部分:

  1. 交换器(Exchange)的持久化
  2. 队列(Queue)的持久化
  3. 消息(Message)的持久化

交换器(Exchange)的持久化

在上篇博客中,我们声明Exchange的代码是这样的:

a1ee17b8197d4b3baeaa3abfb1125960

这种情况下声明的Exchange是非持久化的,在RabbitMQ出现异常情况(重启,宕机)时,该Exchange会丢失,会影响后续的消息写入该Exchange,那么如何设置Exchange为持久化的呢?答案是设置durable参数。

durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。

持久化可以将交换器存盘,在服务器重启的时候不会丢失相关信息。

设置Exchange持久化:

09cb41b817cf40af857ebe3068adad55

此时调用的重载方法为:

6322f31bb25346488d8bcef1e362f307

为了能更好的理解,我们新建个生产类如下:

b746ed69335e410f94936cbeb52a0c15

示例代码中,我们新建了1个非持久化的Exchange,1个非持久化的Queue,并将它们做了绑定,此时运行代码,Exchange和Queue新建成功,消息‘durable exchange test’也被正确地投递到了队列中:

ace968fc29d84f81807bb9a4153657d6
cd3edc5345504836a3b345773f3c8626

此时重启下RabbitMQ服务,会发现Exchange丢失了:

a544a707860f411ba278f04d5b37cfcb

修改下代码,将durable参数设置为ture:

49bd42c51b344817b22f7184a7a9f12f

此时运行完代码,然后重启下RabbitMQ服务,会发现Exchange不再丢失:

cd45044db5c14496ab6f4e53477d241c

队列(Queue)的持久化

细心的网友可能会发现,虽然现在重启RabbitMQ服务后,Exchange不丢失了,但是队列和消息丢失了,那么如何解决队列不丢失呢?答案也是设置durable参数。

durable:设置是否持久化。为true则设置队列为持久化。

持久化的队列会存盘,在服务器重启的时候可以保证不丢失相关信息。

简单修改下上面声明Queue的代码,将durable参数设置为true:

dc95c966220f4cda9d5562687a75da21

此时调用的重载方法如下:

49a6bc08c0754a779b910f40c13e3efb

运行代码,然后重启RabbitMQ服务,会发现队列现在不丢失了:

b1bca58be81f400ea15c3c32ba06657e

消息(Message)的持久化

虽然现在RabbitMQ重启后,Exchange和Queue都不丢失了,但是存储在Queue里的消息却仍然会丢失,那么如何保证消息不丢失呢?答案是设置消息的投递模式为2,即代表持久化。

修改发送消息的代码为:

fb3951e1b2df4d06ab99c6b792684599

调用的重载方法为:

0f8570787f514f39a99018a355a496e7

运行代码,然后重启RabbitMQ服务,发现此时Exchange,Queue,消息都不丢失了:

ace968fc29d84f81807bb9a4153657d6
cd3edc5345504836a3b345773f3c8626

至此,我们完美的解决了RabbitMQ重启后,消息丢失的问题。

最终的代码如下:

f89dabf4c7e7450c89c42407dc72b641

注意事项

  1. 理论上可以将所有的消息都设置为持久化,但是这样会严重影响RabbitMQ的性能。因为写入磁盘的速度比写入内存的速度慢得不止一点点。对于可靠性不是那么高的消息可以不采用持久化处理以提高整体的吞吐量。在选择是否要将消息持久化时,需要在可靠性和吞吐量之间做一个权衡。
  2. 将交换器、队列、消息都设置了持久化之后仍然不能百分之百保证数据不丢失,因为当持久化的消息正确存入RabbitMQ之后,还需要一段时间(虽然很短,但是不可忽视)才能存入磁盘之中。如果在这段时间内RabbitMQ服务节点发生了宕机、重启等异常情况,消息还没来得及落盘,那么这些消息将会丢失。
  3. 单单只设置队列持久化,重启之后消息会丢失;单单只设置消息的持久化,重启之后队列消失,继而消息也丢失。单单设置消息持久化而不设置队列的持久化显得毫无意义。

最后

读到这的朋友可以转发关注下,后面还会有更多精选文章分享!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用RabbitMQ可以采取以下几种方式来保证消息丢失。首先,可以使用持久化机制,确保消息RabbitMQ服务宕机后不会丢失。这可以通过将消息标记为持久化,以及确保队列和交换机也是持久化的来实现。\[1\]其次,可以使用RabbitMQ提供的ack机制,即手动确认消息的处理完成。通过关闭自动ack功能,并在代码中手动调用ack,可以确保消息在处理完之后再从内存中删除,避免消息丢失。\[2\]此外,还可以使用事务或confirm模式来保证消息的可靠性。通过在生产者将消息推送到RabbitMQ时开启事务或confirm模式,可以确保消息到达Exchange,并且根据RoutingKey正确地到达对应的Queue中,从而避免消息丢失。\[3\]综上所述,通过持久化、手动确认和使用事务或confirm模式,可以有效地保证使用RabbitMQ消息丢失。 #### 引用[.reference_title] - *1* *3* [RabbitMQ 保证消息丢失的几种手段](https://blog.csdn.net/zhiyikeji/article/details/130190175)[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^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [如何保证 RabbitMQ 消息丢失?](https://blog.csdn.net/m0_71777195/article/details/129682495)[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^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值