本发明涉及计算机应用技术领域,具体涉及分布式消息异步通知中间件实现方法及系统。
背景技术:
在信息系统交互下经常会有通知内部服务或外部系统异步接口的出现。因http请求的不可控性会出现http请求接口响应失败(响应状态码值为403,500,502,503等视为请求失败)或者连接超时。发生的情况是浏览器开始侦听该服务器的响应消息,但是由于各种原因该响应可能永远不会到达(例如,服务器处于脱机状态)。因此,如果x秒钟后服务器仍然没有响应,您的浏览器将在等待时“放弃”,否则可能会因为等待永恒而卡住,响应结果报文超时等导致业务应用系统出现两边业务不一致行为。例如应用系统a与b系统交互支付业务,a系统支付状态为支付成功,但b系统支付状态为失败,实际业务支付状态为成功。
这是一种典型的分布式系统事务问题。业内的通用做法如下:
采用定时任务轮询补偿的方法,通过定时任务(固定时间频率的任务)扫描因http请求失败或异常的信息以补偿的形式通知(将失败的业务再执行一次)。这种做法较为古老,且性能较低。每一个业务用例场景都需要写定时任务做补偿。当业务发展较快用例场景较多则对应的定时任务较多产生定时任务爆炸问题。
采用单体式内存重试(如springretry)的方法,此种方式是在内存中做重试机制,如果应用服务重启则会断开导致信息丢失,导致业务不一致。例如网络服务a因操作系统重启,操作系统重启会将内存中的内容清空返回初始状态。而当时未完成的任务就会丢失,从而导致业务未完成,对公司产生的一定的损失。
技术实现要素:
本发明的目的是提供分布式消息异步通知中间件实现方法及系统,解决分布式系统异步通知消息可追溯性,解决分布式系统业务最终一致性问题,能够及时对易想金聪告警。
本发明提供了如下的技术方案:
分布式消息异步通知中间件实现方法及系统,包括以下步骤:
s1、中间件接收http请求并将请求的消息持久化至数据库中,并将持久化成功后的数据根据优先级别高与优先级别正常进行分类;
s2、对于优先级别高的请求实时进行处理;对于优先级别正常的数据推送至rabbitmq延迟队列池中,根据事先设定的队列延迟策略,对到达延迟时间后的延迟队列消息进行处理;
s3、以http接口形式调用外部系统对上述数据进行处理,并判断响应报文是否包含设置的期望内容;
s4、若所述响应报文包含所述期望内容,则将信息状态更新为成功,该请求消息对应的任务完成并结束;若所述响应报文不包含所述期望内容,则计算失败次数并判断其是否已达配置事先设定的最大重试次数;
s5、若失败次数小于最大重试次数,将对应的请求消息推送至延迟队列池,并重复s2-s4;若失败次数大于最大重试次数,则调用通信软件进行异常告警通知,任务结束。
优选的,步骤s5所述的通信软件为钉钉。
优选的,所述rabbitmq为实现了高级消息队列协议的开源消息代理软件。
优选的,包括:
信息接收模块,接收用户通过应用软件发送的消息请求,并将请求消息进行持久化处理,将持久化成功后的消息传输至数据库;
数据库,接收信息接收模块发送的请求消息,并将其根据优先级别将其分类存储,将优先级高的请求消息发送至操作系统软件进行处理;将优先级正常的请求消息发送至延迟rabbitmq软件延迟消息队列;
延迟消息队列,设定有队列延迟策略,将到达了延迟时间后的请求消息发送至操作系统软件进行处理;
信息反馈模块,判断操作系统软件处理后的响应报文是否包含设置的期望内容,当响应报文包含设置的期望内容时,判断任务成功,并结束任务;当响应报文不包含设置的期望内容时,判断任务失败,对失败次数进行计数,并将失败次数与最大重试次数进行对比,当失败次数小于最大重试次数时,将请求信息传输至延迟消息队列进行等待处理,当失败次数大于最大重试次数时,判断任务异常,并将已成信息告知事先设定的告警终端。
优选的,以http接口形式调用外部所述操作系统软件进行信息处理。
本发明的有益效果是:根据请求信息的优先级对其进行分布处理,使优先级正常的数据进行固定时间的等待再进行处理,实现了对不同优先级的信息分级处理,减少进程等待时间,提高执行效率;调用外部系统对不同优先级的数据进行统一处理,解决分布式系统业务最终一致性问题,从而保证业务闭环;对失败次数进行计算,并根据其数量进行实时告警,便于研发人员第一时间知晓并及时处理。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,与本发明的实施例一起用于解释本发明,并不构成对本发明的限制。在附图中:
图1是本发明实现方法流程图;
图2是本发明系统架构图;
图3是本发明应用架构图;
图4是本发明实施例应用时序图。
具体实施方式
如图1-3所示,分布式消息异步通知中间件实现方法,包括以下步骤:
s1、中间件接收http请求并将请求的消息持久化至数据库中,并将持久化成功后的数据根据优先级别高与优先级别正常进行分类;
s2、对于优先级别高的请求实时进行处理;对于优先级别正常的数据推送至rabbitmq延迟队列池中,根据事先设定的队列延迟策略,对到达延迟时间后的延迟队列消息进行处理;
s3、以http接口形式调用外部系统对上述数据进行处理,并判断响应报文是否包含设置的期望内容;
s4、若响应报文包含期望内容,则将信息状态更新为成功,该请求消息对应的任务完成并结束;若响应报文不包含期望内容,则计算失败次数并判断其是否已达配置事先设定的最大重试次数;
s5、若失败次数小于最大重试次数,将对应的请求消息推送至延迟队列池,并重复s2-s4;若失败次数大于最大重试次数,则调用通信软件进行异常告警通知,任务结束。
优选的一种实施例,步骤s5的通信软件为钉钉。
其中,rabbitmq为实现了高级消息队列协议的开源消息代理软件。
如图2所示,分布式消息异步通知中间件实现系统,包括:
信息接收模块,接收用户通过应用软件发送的消息请求,并将请求消息进行持久化处理,将持久化成功后的消息传输至数据库;
数据库,接收信息接收模块发送的请求消息,并将其根据优先级别将其分类存储,将优先级高的请求消息发送至操作系统软件进行处理;将优先级正常的请求消息发送至延迟rabbitmq软件延迟消息队列;
延迟消息队列,设定有队列延迟策略,将到达了延迟时间后的请求消息发送至操作系统软件进行处理;
信息反馈模块,判断操作系统软件处理后的响应报文是否包含设置的期望内容,当响应报文包含设置的期望内容时,判断任务成功,并结束任务;当响应报文不包含设置的期望内容时,判断任务失败,对失败次数进行计数,并将失败次数与最大重试次数进行对比,当失败次数小于最大重试次数时,将请求信息传输至延迟消息队列进行等待处理,当失败次数大于最大重试次数时,判断任务异常,并将已成信息告知事先设定的告警终端。
优选的一种实施例,以http接口形式调用外部操作系统软件进行信息处理。
具体的,本发明提供的中间件,其任务属性包括:
url:http访问url;headers:http接口请求头信息;body:消息体内容;httpmethod:请求方法get、post;期望结果:期望的报文结果包含内容;来源应用:发起业务源;目标应用:远程调用目标应用;来源ip:调用方ip地址;优先级别:http请求的优先级别,高级别、正常级别,高级别的必达任务处理速度优先,类似高速路而正常级别的类似于普通公路。此参数决定了任务的处理速度;已重试次数:当前已重试次数;最大重试次数:任务失败时执行的最大重试次数。
如图4所示,来源应用接入最新版本miss-clientsdk(java)或通过http接口形式跨语言,配置分配的应用id(鉴权)即可使用。
本发明根据请求信息的优先级对其进行分布处理,使优先级正常的数据进行固定时间的等待再进行处理,实现了对不同优先级的信息分级处理,减少进程等待时间,提高执行效率;调用外部系统对不同优先级的数据进行统一处理,解决分布式系统业务最终一致性问题,从而保证业务闭环;对失败次数进行计算,并根据其数量进行实时告警,便于研发人员第一时间知晓并及时处理。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。