掌桥专利:专业的专利平台
掌桥专利
首页

基于消息入库机制的防rabbitmq丢失消息系统及方法

文献发布时间:2023-06-19 19:33:46


基于消息入库机制的防rabbitmq丢失消息系统及方法

技术领域

本发明涉及通信技术领域,具体地说是一种基于消息入库机制的防rabbitmq丢失消息系统及方法。

背景技术

rabbitmq是实现了高级消息队列协议的开源消息代理软件(亦称面向消息的中间件)。在各种企业系统中被广泛使用,作为消息中间件,起到解耦、削峰、异步等作用。

消息在消息队列rabbitmq的组件之间流动的过程如下:

(1)、生产者向Exchange发送消息;

(2)、Exchange根据消息属性将消息路由到Queue进行存储;

(3)、消费者从Queue拉取消息进行消费。

rabbitmq处理消息时,可能出现消息丢失的场景。常见的消息丢失场景如下:

①、生产环境网络波动导致丢包,如生产者向rabbitmq发送消息时丢失;

②、生产者,消费者故障导致的数据丢失,如消费者刚消费到数据,但还没真正处理完成便发生故障导致消息丢失。

rabbitmq本身提供了一些机制防止消息丢失,例如事务消息机制、confirm消息确认机制、消息持久化机制、手动确认机制等。但是这些机制存在如下问题:

①、事务消息机制、confirm消息确认机制、消息持久化机制、手动确认机制均由rabbitmq服务端保证的,一旦rabbitmq出现故障,例如rabbitmq所在服务器宕机,那么在宕机期间,rabbitmq无法保证消息不丢失;

②、存在效率问题,事务消息机制、confirm消息确认机制、消息持久化机制、手动确认机制会降低rabbitmq的运行速度,无法充分发挥rabbitmq的性能。

故如何实现消息入库以防止互联网项目中rabbitmq丢失消息是目前亟待解决的技术问题。

发明内容

本发明的技术任务是提供一种基于消息入库机制的防rabbitmq丢失消息系统及方法,来解决互联网项目中使用rabbitmq消息队列时出现的消息丢失的问题。

本发明的技术任务是按以下方式实现的,一种基于消息入库机制的防rabbitmq丢失消息系统,该系统包括,

消息入库模块,用于将产生的消息存入到redis中;其中,消息存入redis前,对消息进行预处理;

消息发送模块,用于将消息发送到rabbitmq中,根据消息发送成功或失败去redis中更改相应消息的状态;

消息消费模块,用于接收消息,进行消费;并根据消息消费成功或失败去redis中更改相应消息的状态;

定时任务处理模块,用于定时检查redis,判断是否有未发送成功以及为消费成功的消息:

若发现有未发送成功的消息,则通知生产者重新发送或者生成告警;

若发现有未消费成功的消息,则通知消费者重新消费或生成告警;

若消息成功消费,则删除redis中存储的消息信息。

作为优选,所述消息入库模块对消息进行加工后入库,消息入库时,有如下要求:

①、以唯一性id作为key值,情况如下:

若消息自带唯一性id,则取出该消息的唯一性id作为入库的key值;

若消息未带唯一性id,则生成该消息的唯一性id作为消息的标志;

②、为了节省redis存储空间同时便于排查出现问题的消息,应当提取消息中有价值的信息作为消息入库内容;消息入库内容包括一个消息状态字段,消息状态字段用于标志消息的状态;消息入库时消息的状态为入库成功但是还未发送;其中,消息入库内容还包括发送次数字段以及消费次数字段;发送次数再短用于记录发送的次数;消费次数字段用于记录消费的次数。

更优地,消息的唯一性id生成方式采用雪花算法,雪花算法ID中有时间戳信息,出现问题时便于排查信息;

雪花算法生成的唯一性id由64个bit组成,各部分具体如下:

第一个部分:1个bit:0,因为ID默认为整数,符号位为0代表为整数;

第二个部分:41个bit:表示的是时间戳,单位是毫秒(ms);

第三个部分:5个bit:表示为机房ID;

第四个部分:5个bit:表示为机器ID;

第五个部分:12个bit:表示的是序号。

作为优选,所述消息发送模块在消息入库成功后,发送对应消息到rabbitmq,并判断该消息是否发送成功:

若该消息发送成功,则去redis中修改对应消息的状态为已发送,发送次数字段加一;

若该消息发送失败,则去redis中修改对应消息的状态为发送失败,发送失败次数加一。

作为优选,所述消息消费模块接收到rabbitmq发送的消息后进行相应处理,并判断该消息消费是否成功:

若该消息消费成功,则去redis中删除这条消息的相关记录;

若该消息消费失败,则去redis中修改对应消息的状态为消费失败,消费次数字段加一。

作为优选,所述定时任务处理模块定时去redis中取出消息,根据消息的状态做相应处理,具体如下:

当消息的状态为发送失败时,判断该消息的发送失败次数是否超过消息发送失败次数阈值:

若该消息的发送失败次数未超过消息发送失败次数阈值,则重新发送该消息,并判断该消息是否发送成功:

若该消息发送成功,则去redis中修改该消息的状态字段为发送成功;

若该消息发送失败,则去redis中将该消息的发送次数字段加一;

若该消息的发送失败次数超过消息发送失败次数阈值,则生成告警信息;

当消息的状态为消费失败时,判断该消息的消费失败次数是否超过消息消费失败次数阈值:

若该消息的消费失败次数未超过消息消费失败次数阈值,则调用消费端重新消费该消息,并判断该消息是否消费成功:

若该消息消费成功,则去redis中删除该条消息;

若该消息消费失败,则去redis将该消息的消费次数字段加一;

若该消息的消费失败次数超过消息消费失败次数阈值,则生成告警信息。

一种基于消息入库机制的防rabbitmq丢失消息方法,该方法具体如下:

消息加工处理:判断消息是否有唯一性id,消息的唯一性id作为key值,并从消息中提取有价值的消息内容作为消息入库内容,消息入库内容包括一个消息状态字段,消息状态字段用于标志消息的状态;

消息存入redis数据库,设置消息的状态为已入库但未发送;其中,消息存入redis前,先提前转为json格式,方便解析;同时采用redis中的string数据结构存储消息,其中唯一性id作为string的key值,json格式的消息作为string的value值;

消息发送端向rabbitmq服务端发送消息,并判断该消息是否发送成功:

若该消息发送成功,则去redis设置该消息的状态为发送成功;

若该消息发送未成功,则设置该消息的状态为发送失败,发送失败次数加一;

消息消费端消费消息,并判断该消息是否消费成功:

若该消息消费成功,则去redis中设置消息的状态为消费成功;

若该消息消费未成功,则去redis中设置消息的状态为消费失败,消费失败次数加一;

定时任务处理:定时检查redis,发现有未发送成功的消息时,通知生产者重新发送或者生成告警;发现有未消费成功的消息时,通知消费者重新消费或生成告警,若消息成功消费,则删除redis中存储的消息信息。

作为优选,定时任务处理具体如下:

从redis中取出状态字段为发送失败和消费失败的消息;

处理发送失败的消息:判断该消息的发送失败次数是否达到该消息发送失败次数阈值:

若消息的发送失败次数超过消息发送失败次数阈值,则说明该消息已经重新发送过多次但是每次都发送失败,此时很可能是发送过程中任一个步骤出现问题,再次发送有很大的可能结果依然是发送失败,直接生成告警或者选择是否重复生成告警:

若未对已经生成告警的消息再次生成告警,则给消息添加一个告警字段,生成告警时设置该字段为true表示已经生成告警,每次生成告警前根据该字段判断是否再次生成告警;

若该消息的发送失败次数未超过消息发送失败次数阈值,则再次发送该消息,并判断是否发送成功:

若该消息发送成功,则去redis中将该消息的状态改为发送成功;

若该消息发送失败,则去redis中将该消息的发送失败次数加一;

处理消费失败的消息:判断该消息的消费失败次数是否达到该消息消费失败次数阈值:

若消息的消费失败次数超过消息消费失败次数阈值,则直接生成告警或选择是否重复生成告警:

若未对已经生成告警的消息再次生成告警,则给消息添加一个告警字段,生成告警时设置该字段为true表示已经生成告警,每次生成告警前根据该字段判断是否再次生成告警;

若消息的消费失败次数未超过消息消费失败次数阈值,则再次消费该消息,并判断该消息是否消费成功:

若该消息消费成功,则去redis中删除该消息;

若该消息消费失败,则去redis中将该消息的消费失败次数加一。

作为优选,消息的唯一性id生成方式采用雪花算法,雪花算法ID中有时间戳信息,出现问题时便于排查信息;

雪花算法生成的唯一性id由64个bit组成,各部分具体如下:

第一个部分:1个bit:0,因为ID默认为整数,符号位为0代表为整数;

第二个部分:41个bit:表示的是时间戳,单位是毫秒(ms);

第三个部分:5个bit:表示为机房ID;

第四个部分:5个bit:表示为机器ID;

第五个部分:12个bit:表示的是序号。

一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机执行指令,当处理器执行所述计算机执行时,实现如上述的基于消息入库机制的防rabbitmq丢失消息方法。

本发明的基于消息入库机制的防rabbitmq丢失消息系统及方法具有以下优点:

(一)本发明通过消息入库防止了rabbitmq处理过程中的消息丢失;

(二)本发明利用redis和xxl-job处理发送失败和消费失败的消息,保障了消息处理的可靠性,缓解了rabbitmq的消息处理压力,提高了系统的吞吐量;同时由于redis和xxl-job都支持集群部署,所以系统的扩展性和可靠性也得到了提升;

(三)本发明将消息防丢失功能从rabbitmq服务中分离出来,将消息存入redis,在发送消息前后、消费消息前后对消息的状态进行更改,同时通过定时任务根据消息的状态对消息进行相应的处理;

(四)本发明利用redis作为消息入库的数据库服务;redis(Remote DictionaryServer),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,提供多种语言的API;redis是一个高性能的key-value数据库,每秒可以执行大约110000个写入操作,或者81 000个读操作,并且支持主从模式,集群模式等,是当今互联网界的主流NoSQL数据库;

(五)本发明利用xxl-job作为定时任务处理服务,xxl-job是一个轻量级分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展,其具有使用简单,弹性扩容缩容、任务失败重试等特点,目前在业界广泛应用于定时任务执行等场景;

(六)本发明解决了互联网项目中使用rabbitmq消息队列时Ian的消息丢失的问题,采用redis作为消息数据库对消息进行入库存储,采用xxl-job定时确认消息是否丢失并做处理,使系统的安全性、稳定性、效率明显提高;

(七)本发明使用雪花算法生成的唯一性id可以方便定位消息是在哪一时刻(第二部分),在哪一机房(第三部分),在哪一机器(第四部分)生成的,便于排查。

附图说明

下面结合附图对本发明进一步说明。

附图1为基于消息入库机制的防rabbitmq丢失消息方法的流程框图。

具体实施方式

参照说明书附图和具体实施例对本发明的基于消息入库机制的防rabbitmq丢失消息系统及方法作以下详细地说明。

实施例1:

本实施例提供了一种基于消息入库机制的防rabbitmq丢失消息系统,该系统包括,

消息入库模块,用于将产生的消息存入到redis中;其中,消息存入redis前,对消息进行预处理;

消息发送模块,用于将消息发送到rabbitmq中,根据消息发送成功或失败去redis中更改相应消息的状态;

消息消费模块,用于接收消息,进行消费;并根据消息消费成功或失败去redis中更改相应消息的状态;

定时任务处理模块,用于定时检查redis,判断是否有未发送成功以及为消费成功的消息:

若发现有未发送成功的消息,则通知生产者重新发送或者生成告警;

若发现有未消费成功的消息,则通知消费者重新消费或生成告警;

若消息成功消费,则删除redis中存储的消息信息。

本实施例中的消息入库模块对消息进行加工后入库,消息入库时,有如下要求:

①、以唯一性id作为key值,情况如下:

若消息自带唯一性id,则取出该消息的唯一性id作为入库的key值;

若消息未带唯一性id,则生成该消息的唯一性id作为消息的标志;

②、为了节省redis存储空间同时便于排查出现问题的消息,应当提取消息中有价值的信息作为消息入库内容;消息入库内容包括一个消息状态字段,消息状态字段用于标志消息的状态;消息入库时消息的状态为入库成功但是还未发送;其中,消息入库内容还包括发送次数字段以及消费次数字段;发送次数再短用于记录发送的次数;消费次数字段用于记录消费的次数。

本实施例中,消息的唯一性id生成方式采用雪花算法,雪花算法ID中有时间戳信息,出现问题时便于排查信息;

雪花算法生成的唯一性id由64个bit组成,各部分具体如下:

第一个部分:1个bit:0,因为ID默认为整数,符号位为0代表为整数;

第二个部分:41个bit:表示的是时间戳,单位是毫秒(ms);

第三个部分:5个bit:表示为机房ID;

第四个部分:5个bit:表示为机器ID;

第五个部分:12个bit:表示的是序号。

本实施例中的消息发送模块在消息入库成功后,发送对应消息到rabbitmq,并判断该消息是否发送成功:

若该消息发送成功,则去redis中修改对应消息的状态为已发送,发送次数字段加一;

若该消息发送失败,则去redis中修改对应消息的状态为发送失败,发送失败次数加一。

本实施例中的消息消费模块接收到rabbitmq发送的消息后进行相应处理,并判断该消息消费是否成功:

若该消息消费成功,则去redis中删除这条消息的相关记录;

若该消息消费失败,则去redis中修改对应消息的状态为消费失败,消费次数字段加一。

本实施例中的定时任务处理模块定时去redis中取出消息,根据消息的状态做相应处理,具体如下:

当消息的状态为发送失败时,判断该消息的发送失败次数是否超过消息发送失败次数阈值:

若该消息的发送失败次数未超过消息发送失败次数阈值,则重新发送该消息,并判断该消息是否发送成功:

若该消息发送成功,则去redis中修改该消息的状态字段为发送成功;

若该消息发送失败,则去redis中将该消息的发送次数字段加一;

若该消息的发送失败次数超过消息发送失败次数阈值,则生成告警信息;

当消息的状态为消费失败时,判断该消息的消费失败次数是否超过消息消费失败次数阈值:

若该消息的消费失败次数未超过消息消费失败次数阈值,则调用消费端重新消费该消息,并判断该消息是否消费成功:

若该消息消费成功,则去redis中删除该条消息;

若该消息消费失败,则去redis将该消息的消费次数字段加一;

若该消息的消费失败次数超过消息消费失败次数阈值,则生成告警信息。

实施例2:

如附图1所示,本实施例提供了一种基于消息入库机制的防rabbitmq丢失消息方法,该方法具体如下:

S1、消息加工处理:判断消息是否有唯一性id,消息的唯一性id作为key值,并从消息中提取有价值的消息内容作为消息入库内容,消息入库内容包括一个消息状态字段,消息状态字段用于标志消息的状态;

S2、消息存入redis数据库,设置消息的状态为已入库但未发送;其中,消息存入redis前,先提前转为json格式,方便解析;同时采用redis中的string数据结构存储消息,其中唯一性id作为string的key值,json格式的消息作为string的value值;

S3、消息发送端向rabbitmq服务端发送消息,并判断该消息是否发送成功:

①、若该消息发送成功,则去redis设置该消息的状态为发送成功;

②、若该消息发送未成功,则设置该消息的状态为发送失败,发送失败次数加一;

S4、消息消费端消费消息,并判断该消息是否消费成功:

①、若该消息消费成功,则去redis中设置消息的状态为消费成功;

②、若该消息消费未成功,则去redis中设置消息的状态为消费失败,消费失败次数加一;

S5、定时任务处理:定时检查redis,发现有未发送成功的消息时,通知生产者重新发送或者生成告警;发现有未消费成功的消息时,通知消费者重新消费或生成告警,若消息成功消费,则删除redis中存储的消息信息。

本实施例步骤S5中的定时任务处理具体如下:

S501、从redis中取出状态字段为发送失败和消费失败的消息;

S502、处理发送失败的消息:判断该消息的发送失败次数是否达到该消息发送失败次数阈值:

(1)、若消息的发送失败次数超过消息发送失败次数阈值,则说明该消息已经重新发送过多次但是每次都发送失败,此时很可能是发送过程中任一个步骤出现问题,再次发送有很大的可能结果依然是发送失败,直接生成告警或者选择是否重复生成告警:

若未对已经生成告警的消息再次生成告警,则给消息添加一个告警字段,生成告警时设置该字段为true表示已经生成告警,每次生成告警前根据该字段判断是否再次生成告警;

(2)、若该消息的发送失败次数未超过消息发送失败次数阈值,则再次发送该消息,并判断是否发送成功:

①、若该消息发送成功,则去redis中将该消息的状态改为发送成功;

②、若该消息发送失败,则去redis中将该消息的发送失败次数加一;

S503、处理消费失败的消息:判断该消息的消费失败次数是否达到该消息消费失败次数阈值:

(1)、若消息的消费失败次数超过消息消费失败次数阈值,则直接生成告警或选择是否重复生成告警:

若未对已经生成告警的消息再次生成告警,则给消息添加一个告警字段,生成告警时设置该字段为true表示已经生成告警,每次生成告警前根据该字段判断是否再次生成告警;

(2)、若消息的消费失败次数未超过消息消费失败次数阈值,则再次消费该消息,并判断该消息是否消费成功:

①、若该消息消费成功,则去redis中删除该消息;

②、若该消息消费失败,则去redis中将该消息的消费失败次数加一。

本实施例中,消息的唯一性id生成方式采用雪花算法,雪花算法ID中有时间戳信息,出现问题时便于排查信息;

雪花算法生成的唯一性id由64个bit组成,各部分具体如下:

第一个部分:1个bit:0,因为ID默认为整数,符号位为0代表为整数;

第二个部分:41个bit:表示的是时间戳,单位是毫秒(ms);

第三个部分:5个bit:表示为机房ID;

第四个部分:5个bit:表示为机器ID;

第五个部分:12个bit:表示的是序号。

实施例3:

本实施例还提供了一种计算机可读存储介质,其中存储有多条指令,指令由处理器加载,使处理器执行本发明任一实施例中的基于消息入库机制的防rabbitmq丢失消息系统及方法。具体地,可以提供配有存储介质的系统或者装置,在该存储介质上存储着实现上述实施例中任一实施例的功能的软件程序代码,且使该系统或者装置的计算机(或CPU或MPU)读出并执行存储在存储介质中的程序代码。

在这种情况下,从存储介质读取的程序代码本身可实现上述实施例中任何一项实施例的功能,因此程序代码和存储程序代码的存储介质构成了本发明的一部分。

用于提供程序代码的存储介质实施例包括软盘、硬盘、磁光盘、光盘(如CD-ROM、CD-R、CD-RW、DVD-ROM、DVD-RAM、DVD-RW、DVD+RW)、磁带、非易失性存储卡和ROM。可选择地,可以由通信网络从服务器计算机上下载程序代码。

此外,应该清楚的是,不仅可以通过执行计算机所读出的程序代码,而且可以通过基于程序代码的指令使计算机上操作的操作系统等来完成部分或者全部的实际操作,从而实现上述实施例中任意一项实施例的功能。

此外,可以理解的是,将由存储介质读出的程序代码写到插入计算机内的扩展板中所设置的存储器中或者写到与计算机相连接的扩展单元中设置的存储器中,随后基于程序代码的指令使安装在扩展板或者扩展单元上的CPU等来执行部分和全部实际操作,从而实现上述实施例中任一实施例的功能。

最后应说明的是:以上各实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述各实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分或者全部技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的范围。

相关技术
  • 一种基于用户进出大门的智能防丢失方法
  • 一种分段确认机制实现短消息系统中级联短消息传输方法
  • 一种分段确认机制实现短消息系统中级联短消息传输方法
技术分类

06120115957135