一种基于消息入库的RabbitMQ全链路数据不丢失的方法及其系统技术方案

技术编号:38429071 阅读:13 留言:0更新日期:2023-08-07 11:26
本发明专利技术提供了一种基于消息入库的RabbitMQ全链路数据不丢失的方法,设计思路主要是采用消息入库和“异步补偿”的机制,如添加定时器和异步处理模块,以解决可能出现网络故障而导致生产端没有收到确认消息的问题;同时通过调整ack机制解决消费端消息丢失问题,确保从生产端到RabbitMQ再到消费端的全链路数据的不丢失。针对极端情况,如网络异常或宕机,通过异步补偿的设计思路解决,达成一定程度上消息数据不丢失的目标。消息数据不丢失的目标。消息数据不丢失的目标。

【技术实现步骤摘要】
一种基于消息入库的RabbitMQ全链路数据不丢失的方法及其系统


[0001]本专利技术涉及计算机通讯
,特别是一种基于消息入库的RabbitMQ全链路数据不丢失的方法及其系统。

技术介绍

[0002]RabbitMQ,它是一套开源(MPL)的消息队列服务软件,是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件);该开源的消息队列服务在很多业务系统会使用到,是面向消息的中间件中较为常用的一种技术方案。现有技术中采用RabbitMQ,消息从生产端到消费端消费要经过3个步骤,如图1所示,即:(1)生产端发送消息到RabbitMQ;(2)RabbitMQ发送消息到消费端;(3)消费端消费这条消息;这3个步骤中的每一步都有可能导致消息丢失,如果是重要的消息,比如支付回调,就需要尽量确保消息的可靠性和不丢失,这个就是本专利技术所解决的问题。
[0003]从生产端投递的消息丢失的原因有很多,比如消息在网络传输的过程中发生网络故障消息丢失,或者消息投递到RabbitMQ时RabbitMQ挂了。针对以上情况,RabbitMQ本身提供了一些机制,比如事务消息机制,但是该机制会严重降低性能,所以一般不采用这种方法,而采用另一种轻量级的解决方案——Confirm消息确认机制。然而确认机制也不是最终方案,因为RabbitMQ收到消息还没来得及将消息持久化到硬盘时,RabbitMQ挂了,这样消息还是会丢失;或者RabbitMQ在发送确认消息给生产端的过程中,由于网络故障而导致生产端没有收到确认消息,这样生产端就不知道RabbitMQ到底有没有收到消息,就不好做接下来的处理。所以除了RabbitMQ提供的一些机制外,需要另外实现一套消息补偿机制,以应对一些极端情况。

技术实现思路

[0004]为克服上述问题,本专利技术的目的是提供一种基于消息入库的RabbitMQ全链路数据不丢失的方法,采用消息入库,将要发送的消息保存到数据库实现RabbitMQ全链路数据不丢失。
[0005]本专利技术采用以下方案实现:一种基于消息入库的RabbitMQ全链路数据不丢失的方法,其特征在于:所述方法包括生产端的消息入库处理机制,该消息入库处理机制具体包括如下步骤:
[0006]步骤S1、在发送消息前先将消息保存到消息数据库中,消息中初始化状态字段status=0,表示生产端将消息发送给了RabbitMQ但还没收到确认;
[0007]步骤S2、生产端从消息数据库取得待推送给RabbitMQ的消息后,在生产端消息确认监听后将status设为1,表示RabbitMQ已收到消息;
[0008]步骤S3、在生产端设置一个定时器,定时检索消息表,将status=0并且超过固定时间后还没收到确认的消息取出重发;
[0009]步骤S4、RabbitMQ发送收到的消息到消费端。
[0010]进一步的,所述步骤S3进一步具体为:消息取出重发会存在失败的情况,则设置最大重发次数,当超过最大重发次数就做异步处理,该异步处理具体为:判断重发次数是否超过设定的次数,是,则调用短信通道发送短信将消息发送给消费端,否,记录日志,进行继续重发消息。
[0011]进一步的,从消息数据库取得待推送给RabbitMQ的消息,该消息的status标志默认状态是0,发送消息并确认成功后将该消息的status标志设置为1;通过异步的方式确保status标志为0的消息都能推送给消息队列RabbitMQ,实现消息不丢失。
[0012]进一步的,还包括采用手动ack机制解决消费端消息丢失,该手动ack机制解决消费端消息丢失具体为:将自动ack机制改为手动ack机制,把ack机制中autoAck参数置为false,对于RabbitMQ服务端而言,队列中的消息分成了两个部分:一部分是等待投递给消费端的消息;另一部分是已经投递给消费端,但是还没有收到消费端确认信号的消息;如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机,则RabbitMQ会安排该消息重新进入队列,且将该消息放在队列头部,等待投递给下一个消费者。
[0013]本专利技术还提供了一种基于消息入库的RabbitMQ全链路数据不丢失的系统,所述系统采用生产端的消息入库处理机制,该消息入库处理机制包括消息入库模块、监听确认模块、定时器设置模块、以及发送消息模块;
[0014]所述消息入库模块,用于在发送消息前先将消息保存到消息数据库中,消息中初始化状态字段status=0,表示生产端将消息发送给了RabbitMQ但还没收到确认;
[0015]所述监听确认模块,用于生产端从消息数据库取得待推送给RabbitMQ的消息后,在生产端消息确认监听后将status设为1,表示RabbitMQ已收到消息;
[0016]所述定时器设置模块,用于在生产端设置一个定时器,定时检索消息表,将status=0并且超过固定时间后还没收到确认的消息取出重发;
[0017]所述发送消息模块,用于RabbitMQ发送收到的消息到消费端。
[0018]进一步的,所述定时器设置模块的实现方式进一步具体为:消息取出重发会存在失败的情况,则设置最大重发次数,当超过最大重发次数就做异步处理,该异步处理具体为:判断重发次数是否超过设定的次数,是,则调用短信通道发送短信将消息发送给消费端,否,记录日志,进行继续重发消息。
[0019]进一步的,从消息数据库取得待推送给RabbitMQ的消息,该消息的status标志默认状态是0,发送消息并确认成功后将该消息的status标志设置为1;通过异步的方式确保status标志为0的消息都能推送给消息队列RabbitMQ,实现消息不丢失。
[0020]进一步的,所述系统还采用手动ack机制解决消费端消息丢失,该手动ack机制解决消费端消息丢失具体为:将自动ack机制改为手动ack机制,把ack机制中autoAck参数置为false,对于RabbitMQ服务端而言,队列中的消息分成了两个部分:一部分是等待投递给消费端的消息;另一部分是已经投递给消费端,但是还没有收到消费端确认信号的消息;如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机,则RabbitMQ会安排该消息重新进入队列,且将该消息放在队列头部,等待投递给下一个消费者。
[0021]本专利技术的有益效果在于:本专利技术采用了消息入库和“异步补偿”的机制,如添加定时器和异步处理,以解决可能出现网络故障而导致生产端没有收到确认消息的问题;同时通过调整ack机制解决消费端消息丢失问题,确保从生产端到RabbitMQ再到消费端的全链路数据的不丢失;并且具备可靠、简单、灵活的特点。
附图说明
[0022]图1是现有技术中消息从生产端到消费端消费的示意图。
[0023]图2是本专利技术的方法流程示意图。
[0024]图3是本专利技术一实施例的消息入库机制示意图。
[0025]图4本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于消息入库的RabbitMQ全链路数据不丢失的方法,其特征在于:所述方法包括生产端的消息入库处理机制,该消息入库处理机制具体包括如下步骤:步骤S1、在发送消息前先将消息保存到消息数据库中,消息中初始化状态字段status=0,表示生产端将消息发送给了RabbitMQ但还没收到确认;步骤S2、生产端从消息数据库取得待推送给RabbitMQ的消息后,在生产端消息确认监听后将status设为1,表示RabbitMQ已收到消息;步骤S3、在生产端设置一个定时器,定时检索消息表,将status=0并且超过固定时间后还没收到确认的消息取出重发;步骤S4、RabbitMQ发送收到的消息到消费端。2.根据权利要求1所述的一种基于消息入库的RabbitMQ全链路数据不丢失的方法,其特征在于:所述步骤S3进一步具体为:消息取出重发会存在失败的情况,则设置最大重发次数,当超过最大重发次数就做异步处理,该异步处理具体为:判断重发次数是否超过设定的次数,是,则调用短信通道发送短信将消息发送给消费端,否,记录日志,进行继续重发消息。3.根据权利要求1所述的一种基于消息入库的RabbitMQ全链路数据不丢失的方法,其特征在于:从消息数据库取得待推送给RabbitMQ的消息,该消息的status标志默认状态是0,发送消息并确认成功后将该消息的status标志设置为1;通过异步的方式确保status标志为0的消息都能推送给消息队列RabbitMQ,实现消息不丢失。4.根据权利要求1所述的一种基于消息入库的RabbitMQ全链路数据不丢失的方法,其特征在于:还包括采用手动ack机制解决消费端消息丢失,该手动ack机制解决消费端消息丢失具体为:将自动ack机制改为手动ack机制,把ack机制中autoAck参数置为false,对于RabbitMQ服务端而言,队列中的消息分成了两个部分:一部分是等待投递给消费端的消息;另一部分是已经投递给消费端,但是还没有收到消费端确认信号的消息;如果RabbitMQ一直没有收到消费端的确认信号,并且消费此消息的消费端已经断开连接或宕机,则RabbitMQ会安排该消息重新进入队列,且将该消息放在队列头部,等待投递给下一个消费者。5.一种基于消息入库的RabbitMQ全链路数据不丢失的系统,其特征在于...

【专利技术属性】
技术研发人员:刘德建李佳郑彬
申请(专利权)人:福建天晴数码有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1