消息丢失方案_RabbitMQ的去重与防止消息的丢失

本文分析了RabbitMQ中消息丢失的原因及解决方案,包括发送端可能出现的网络故障、交换机和队列的问题,以及消费端处理异常时如何避免消息丢失。同时提出了基于业务逻辑的去重策略,利用本地消息消费表记录已消费消息,以业务字段主键作为去重标准。此外,讨论了使用本地消息表对性能的影响,并提供了管理这些记录的方法。
摘要由CSDN通过智能技术生成

Rabbitmq作为高并发的消息中间件,本文不在阐述基础概念。旨在分析与提供解决消息的丢失与重复的解决思路。

95c19888fecfbc095d2ae9bac7b69007.png

RabbitMQ架构流程图

根据以上架构图,要明白消息走向的整个流程,生产者发送消息——》交换机(路由器)——》队列——》被消费者消费。以上几个流程任何环节出问题都会导致消息的丢失,下面详细分情况介绍。

一、消息丢失

首要前提是设置了队列,交换器都是可持久化的,更重要的是设置了消息的手动确认

0a966c66698752f595e1cc3cc07a3de6.png
b7182329e394d5d96277e9d206a958c4.png

通过以上两张源码截图可以发现队列和交换机默认都是可持久化的,如下设置手动消息确认

2d171450036538a43ae42999bc155beb.png

1.发送者发送失败(网络原因等)

1.1 没有正常发送到exchange路由器(交换机)

7a3d836cba2e97dd6b8af61b7fcc0231.png

该方法ack参数为false时说明消息没有被正确发送到路由器,可将该消息保存本地消息表,使用任务调度器重新发送

1.2没有被正确的路由到队列

f4001339f0e8d473920123971bd746aa.png

进入该方法returnedMessage,则表明未被正确路由到消息队列,具体原因可以看replyCode和replyText,比如绑定规则有误等,可将该消息保存本地消息表,使用任务调度器重新发送。

至此发送端的消息丢失已经解决,我们在看下消费端的。

1.3消息在消费端处理业务时没有做异常处理就确认,从而使消息被移除队列导致消息丢失

775b0006b878c86b95c34c663101a9a3.png

在此处分两种情况,一,消息被正确消费则basicAck,从队列删除消息。二,消息在处理业务时发生异常未被正确消费basicReject,不要重新入队列,而是本地消息表中记录,使用任务调度器重新发送。

二、消息去重

基于业务逻辑进行去重,不要依赖rabbitmq。在消费端应该有一个本地消息消费表记录已经被成功消费的消息信息,业务字段主键作为去重标准。

最后,有人会反思用了按照以上方案,用了rabbitmq还用本地消息表,降低了性能,在生产端我们消息失败表的记录,重新发送并且重新消费成功,就可以删除该条记录了,该表的记录不会太大,还有就是消费端的未正常消费的记录同理操作。去重表最好借助redis保存业务主键快速识别是否已经被消费,在判断是重复消息时一定要记得basicAck手工确认,避免再次发送。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值