CN109710421B - 消息中间件的接收者异常处理方法、服务器及存储介质 - Google Patents
消息中间件的接收者异常处理方法、服务器及存储介质 Download PDFInfo
- Publication number
- CN109710421B CN109710421B CN201811379795.6A CN201811379795A CN109710421B CN 109710421 B CN109710421 B CN 109710421B CN 201811379795 A CN201811379795 A CN 201811379795A CN 109710421 B CN109710421 B CN 109710421B
- Authority
- CN
- China
- Prior art keywords
- message
- receiver
- thread
- fault
- network
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Computer And Data Communications (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种消息中间件的接收者异常处理方法,包括:发送者将消息发送至网络后,将消息放入第一共享内存,并在第一异步持久化组件的作用下,将消息写入磁盘;接收者从网络上接收到消息后,将消息放入第二共享内存,并在第二异步持久化组件的作用下,将消息写入磁盘;在检测到接收者中存在非关键慢接收者时,从接收者的预定磁盘中读取消息并递交给应用进行处理;在检测到接收者中存在故障时,将发送者发送的消息进行缓存,并停止向网络发送消息。本发明还公开了一种服务器及计算机可读存储介质。本发明可以满足高速消息中间件的超低时延要求的情况下,还能使局部故障、慢接收者不会影响整个分布式系统。
Description
技术领域
本发明涉及互联网金融技术领域,尤其涉及一种消息中间件的接收者异常处理方法、服务器及计算机可读存储介质。
背景技术
消息中间件利用高效可靠的消息传递机制进行平台无关的消息交换,是分布式环境下应用组件间通信的重要基础系统。传统的消息中间件通常都有中央消息服务器(Broker,简称代理节点),消息发送者和接收者都连接到这个代理节点,并依赖该代理节点进行消息分发和故障隔离,而不是彼此间直接通信。当接收者故障时,消息中间件的代理节点将继续接收并存储消息;当接收者故障恢复后,接收者可以从代理节点继续接收断点消息。代理节点将发送者和接收者解耦,慢接收者不会影响发送者的发送和处理。基于代理节点的消息中间件主要的问题是所有消息都必须通过中央消息服务器转发,时延较高,无法满足超低时延环境如证券交易系统的需求。
为解决这种问题,现有方案采用无代理节点的消息中间件,应用程序彼此间可以直接通信,无需通过中间代理节点,因此,非常适合在超低时延的场景下使用。但无代理消息中间件没有中央消息服务器,在接收者故障、接收者处理较慢等场景下,没有一套完整的方案进行故障隔离,应用层需要选择阻塞等待接收者恢复、或者选择丢弃消息来继续进行业务处理。若选择丢弃消息,则会造成应用消息丢失,不适合证券交易系统等高可靠的应用场景。对于非关键的慢接收者,可能会向上蔓延影响发送者的处理速度。
发明内容
本发明的主要目的在于提供一种消息中间件的接收者异常处理方法、服务器及计算机可读存储介质,旨在满足高速消息中间件的超低时延要求的情况下,还能使局部故障、慢接收者不会影响整个分布式系统。
为实现上述目的,本发明提供一种消息中间件的接收者异常处理方法,所述消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,包括以下步骤:
所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
优选地,所述在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络的步骤包括:
在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的所述预设消息发送线程;
将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息;
在检测到发生故障的所述接收者恢复正常时,按照所述消息的发送顺序,通过所述预设消息发送线程将缓存的所述消息发送至所述网络,以发送至对应的接收者。
优选地,所述在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的所述预设消息发送线程的步骤之后还包括:
通过所述预设消息发送线程注册故障主题;
其中,所述将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息的步骤包括:
获取所述发送者发送的对应所述故障主题的消息;
将对应所述故障主题的消息在所述第一异步持久化组件的作用下进行持久化处理,并停止向所述网络发送消息。
优选地,所述通过所述预设消息发送线程注册故障主题的步骤之后还包括:
所述预设消息发送线程将所述故障主题添加到请求队列中;
从线程池中申请预设子线程,以处理接收者故障期的消息重传;
其中,所述获取所述发送者发送的对应所述故障主题的消息的步骤包括:
在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息。
优选地,所述在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息的步骤之后还包括:
通过所述预设子线程调用对应的故障主题,所述预设子线程以阻塞方式向所述接收者发送所述历史消息。
优选地,所述通过所述预设子线程调用对应的故障主题,向所述接收者发送所述历史消息的步骤之后包括:
在发生故障的所述接收者恢复正常时,通过所述预设子线程将所述历史消息发送至所述网络。
优选地,所述在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息的步骤之后还包括:
获取所述预设子线程发送的对应所述故障主题的历史消息,与所述第一异步持久化组件持久化的历史消息之间的序列号差值;
在所述序列号差值小于预设阈值时,所述发送者以非阻塞方式向所述接收者发送所述历史消息。
为实现上述目的,本发明还提供一种服务器,所述服务器包括处理器以及存储在所述处理器内并可在所述处理器上运行的消息中间件的接收者异常处理程序,其中,所述消息中间件的接收者异常处理程序被所述处理器执行时实现如上所述的消息中间件的接收者异常处理方法的步骤。
为实现上述目的,本发明还提供一种服务器,所述消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,所述服务器包括:
第一写入模块,用于所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
第二写入模块,用于所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
读取模块,用于在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
发送模块,用于在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
为实现上述目的,本发明还提供一种所述计算机可读存储介质上存储有消息中间件的接收者异常处理程序,所述消息中间件的接收者异常处理程序被处理器执行实现如上所述的消息中间件的接收者异常处理方法的步骤。
本发明提供的消息中间件的接收者异常处理方法、服务器及计算机可读存储介质,通过发送者将消息发送至网络后,将所述消息放入第一共享内存,并在第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘,然后接收者从所述网络上接收到所述消息后,将所述消息放入第二共享内存,并在第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘,在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理,在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。如此,在满足高速消息中间件的超低时延要求的情况下,还能使局部故障、慢接收者不会影响整个分布式系统。
附图说明
图1为本发明实施例方案涉及的硬件运行环境的服务器的结构示意图;
图2为本发明消息中间件的接收者异常处理方法第一实施例的流程示意图;
图3为图2中步骤S4第一实施例的细化流程示意图;
图4为图2中步骤S4第二实施例的细化流程示意图;
图5为图4中步骤S421第一实施例的细化流程示意图;
图6为图4中步骤S421第二实施例的细化流程示意图;
图7为本发明服务器一实施例的功能模块示意图。
本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。
具体实施方式
应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
如图1所示,本发明的服务器包括:处理器1001,例如CPU,用户接口1002,存储器1003,通信总线1004。其中,通信总线1004用于实现这些组件之间的连接通信。用户接口1002可以包括显示屏(Display)、输入单元。存储器1003可以是高速RAM存储器,也可以是稳定的存储器(non-volatile memory),例如磁盘存储器。存储器1003可选的还可以是独立于前述处理器1001的存储装置。
本领域技术人员可以理解,图1中示出的服务器结构并不构成对服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件布置。
如图1所示,作为一种计算机存储介质的存储器1003中可以包括操作系统、网络通信模块、用户接口模块以及消息中间件的接收者异常处理程序。
在图1所示的服务器中,用户接口1002主要用于接收用户通过触摸显示屏或在输入单元输入指令触发用户指令;服务器的消息中间件发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,处理器1001用于调用存储器1003中存储的消息中间件的接收者异常处理程序,并执行以下操作:
所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的所述预设消息发送线程;
将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息;
在检测到发生故障的所述接收者恢复正常时,按照所述消息的发送顺序,通过所述预设消息发送线程将缓存的所述消息发送至所述网络,以发送至对应的接收者。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
通过所述预设消息发送线程注册故障主题;
其中,所述将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息的步骤包括:
获取所述发送者发送的对应所述故障主题的消息;
将对应所述故障主题的消息在所述第一异步持久化组件的作用下进行持久化处理,并停止向所述网络发送消息。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
所述预设消息发送线程将所述故障主题添加到请求队列中;
从线程池中申请预设子线程,以处理接收者故障期的消息重传;
其中,所述获取所述发送者发送的对应所述故障主题的消息的步骤包括:
在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
通过所述预设子线程调用对应的故障主题,所述预设子线程以阻塞方式向所述接收者发送所述历史消息。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
在发生故障的所述接收者恢复正常时,通过所述预设子线程将所述历史消息发送至所述网络。
进一步地,处理器1001可以调用存储器1003中存储的消息中间件的接收者异常处理程序,还执行以下操作:
获取所述预设子线程发送的对应所述故障主题的历史消息,与所述第一异步持久化组件持久化的历史消息之间的序列号差值;
在所述序列号差值小于预设阈值时,所述发送者以非阻塞方式向所述接收者发送所述历史消息。
参照图2,在第一实施例中,本发明提供一种消息中间件的接收者异常处理方法,所述消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,包括以下步骤:
步骤S1、所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
本实施例中,本发明在消息中间件的发送者和接收者两个方向分别放置基于共享内存的异步持久化组件,即发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件。
发送者将消息发送到网络后,将消息放入所述第一共享内存中,本地的所述第一异步持久化组件会读取该消息,并将所述消息写入所述第一异步持久化组件的磁盘。
步骤S2、所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
本实施例中,所述接收者从网络上接收到所述消息之后,先将所述消息放入所述第二共享内存,供所述第二异步持久化组件进行异步持久化进程,再递交给应用进行处理,此时,本地的第二异步持久化组件会将该消息写入磁盘。
步骤S3、在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
本实施例中,所述非关键慢接收者为处理速度较慢的非关键接收者,可以从接收者的预定磁盘中读取消息并递交给应用进行处理,从而将发送者和接收者解耦,而慢接收者并不会影响发送者。
本发明实现的消息中间件接收者可以配置两种模式:普通模式和慢接收者消息缓存模式。其中,对于处理速度正常的接收者,可以使用普通模式,应用处理消息与消息持久化并发进行;对于处理速度较慢的非关键接收者,可以使用慢接收者消息缓存模式,消息持久化与应用处理消息串行,也即先将消息写入磁盘,再从磁盘读取文件进行消息处理。可以理解的是,接收者从这两种模式中选择其中一种进行配置执行。具体地,
普通模式:消息回调线程获取到网络实时消息,先发给本地持久化组件进行异步持久化,然后再将消息指针放入应用队列中,应用队列的消息在应用处理之后释放消息。在这种模式下,如果应用处理消息速度较慢,则应用队列会被塞满,并最终造成消息丢弃和消息重传。
慢接收者消息缓存模式:相当于在无代理消息中间件的接收者内部实现了一个消息代理服务。接收者将网络实时消息放入本地持久化组件的共享内存后立刻返回并释放消息。消息中间件启动一个额外的异步持久化组件读取线程,从磁盘中获取消息并递交给应用处理。
步骤S4、在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
本实施例中,在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,也即消息仅缓存在发送者的本地持久化组件中,不再发送到网络中,从而避免网络拥塞;当检测到发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。如此,可以在接收者故障时,发送者缓存的消息可以用来补传接收者故障期间的消息。
可以理解的是,本发明中所述接收者异常的情况包括接收者中存在非关键慢接收者,或接收者中存在故障等。
本发明提供的消息中间件的接收者异常处理方法,通过发送者将消息发送至网络后,将所述消息放入第一共享内存,并在第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘,然后接收者从所述网络上接收到所述消息后,将所述消息放入第二共享内存,并在第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘,在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理,在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。如此,在满足高速消息中间件的超低时延要求的情况下,还能使局部故障、慢接收者不会影响整个分布式系统。
参照图3,在第二实施例中,基于第一实施例,所述步骤S4包括:
步骤S41、在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的所述预设消息发送线程;
本实施例中,实现接收者故障隔离的总体思路是,当消息中间件发现接收者故障后,消息中间件将发送者递交的消息缓存,当消息中间件再次发现接收者恢复后,再将缓存的消息发出。消息发送者持续处理和发送消息,接收者故障对发送者透明,由消息中间件隔离故障。
接收者有可能长时间故障,为了不会因为缓冲区满而阻塞发送者,需要将发送者递交的消息持久化到文件。因为消息中间件需要负责在接收者组件恢复后发送尚未发送的消息,所以消息中间件创建了独立的预设消息发送线程,如DownTimeMsgSender(故障期间消息发送器)线程。
步骤S42、将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息;
步骤S43、在检测到发生故障的所述接收者恢复正常时,按照所述消息的发送顺序,通过所述预设消息发送线程将缓存的所述消息发送至所述网络,以发送至对应的接收者。
本实施例中,为各个发生故障的接收者开启独立的发送线程,从持久化文件中获取尚未发送的消息,按照原先的发送顺序发送给对应的接收者。发送持久化消息需要经过多个环节,并且伴随着文件的数据输入和输出,因此,所述预设消息发送线程,如DownTimeMsgSender线程会在适当时机,让发送者组件重新直接发送消息给故障恢复的接收者。
参照图4,在第三实施例中,基于第二实施例,所述步骤S41之后还包括:
步骤S44、通过所述预设消息发送线程注册故障主题;
本实施例中,正常情况下,每个主题的消息由发送者先发送到网络中,成功之后再交由所述第一异步持久化组件进行持久化处理。
而当接收者发生故障时,每个接收者对应于发送者的一个主题对象,接收者故障的处理以主题为单位。当消息发送阻塞或接收者故障时,消息中间件将对应的主题状态标记为“接收者已故障”状态,并向所述预设消息发送线程如DownTimeMsgSender注册该主题。此后该主题方向递交的消息则只交由所述第一异步持久化组件持久化,不再向网络上发送。
此时,参照图4,所述步骤S42包括:
步骤S421、获取所述发送者发送的对应所述故障主题的消息;
步骤S422、将对应所述故障主题的消息在所述第一异步持久化组件的作用下进行持久化处理,并停止向所述网络发送消息。
本实施例中,通过获取对应故障主题方向的消息,并将获取的消息交由所述第一异步持久化组件进行持久化处理,此时,所述发送者停止向所述网络发送消息,如此,可以将对应故障主题方向的消息进行缓存,在发生故障的所述接收者恢复正常时,即可将尚未发送的缓存消息发出,从而可以避免网络拥塞。
步骤S45、所述预设消息发送线程将所述故障主题添加到请求队列中;
步骤S46、从线程池中申请预设子线程,以处理接收者故障期的消息重传。
本实施例中,所述预设消息发送线程受理相应的请求,将所述故障主题添加到请求队列中,并从线程池中申请预设子线程如DownTimeJob(故障期消息发送作业)线程,以处理接收者故障期的消息重传。DownTimeJob线程启动后,会向第一异步持久化组件请求获取消息,第一异步持久化组件回应一个句柄,DownTimeJob线程通过返回的句柄获取相应主题的历史消息。
其中,参照图5,所述步骤S421包括:
步骤S4211、在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息。
步骤S4212、通过所述预设子线程调用对应的故障主题,所述预设子线程以阻塞方式向所述接收者发送所述历史消息。
步骤S4213、在发生故障的所述接收者恢复正常时,通过所述预设子线程将所述历史消息发送至所述网络。
本实施例中,所述预设子线程如DownTimeJob线程获得对应所述故障主题的历史消息以后,调用相应的主题以阻塞方式向接收者发送历史消息。当发生故障的接收者未恢复正常时,所述预设子线程在所述主题上阻塞,直至所述接收者恢复;当发生故障的接收者恢复正常时,DownTimeJob线程立刻将持久化的历史消息发送至所述网络。
参照图6,在第四实施例中,基于第三实施例,所述步骤S4211之后还包括:
步骤S4214、获取所述预设子线程发送的对应所述故障主题的历史消息,与所述第一异步持久化组件持久化的历史消息之间的序列号差值;
本实施例中,可以理解的是,所述预设子线程如DownTimeJob线程发送的对应所述故障主题的历史消息为实际发送的历史消息,也即持久化消息中序号排首位的历史消息,而所述第一异步持久化组件持久化的历史消息为所述故障主题持久化的全部历史消息,也即持久化消息中序号排末尾的历史消息。可以理解的是,消息序列号递增,先持久化的消息序列号小,后持久化的消息序列号大。
步骤S4215、在所述序列号差值小于预设阈值时,所述预设子线程以非阻塞方式向所述接收者发送所述历史消息。
本实施例中,当所述序列号差值小于预设阈值时,为了防止此时接收者故障导致的死锁,此时,所述预设子线程采用非阻塞式发送消息给下游。
可以理解的是,所述预设子线程在所述主题上阻塞时,所述发送者不提交任何消息,直至所述预设子线程发送完所有所述历史消息,所述发送者则恢复正常流程。
在所述序列号差值小于预设阈值时,可以阻止所述预设子线程再递交对应所述故障主题的新消息,并在所述历史消息传输完毕之后,将所述故障主题方向的消息发送流程切回普通流程,释放服务该主题的预设子线程如DownTimeJob线程,并更新主题状态,也即将主题状态由“接收者已故障”更新为“接收者已恢复”。
本发明还提供一种服务器,所述服务器包括处理器以及存储在所述处理器内并可在所述处理器上运行的消息中间件的接收者异常处理程序,其中,所述消息中间件的接收者异常处理程序被所述处理器执行时实现如上所述的消息中间件的接收者异常处理方法的步骤。
本发明还提供一种计算机可读存储介质,所述计算机可读存储介质上存储有消息中间件的接收者异常处理程序,所述消息中间件的接收者异常处理程序被处理器执行实现如上所述的消息中间件的接收者异常处理方法的步骤。
本发明还提供一种服务器10,参照图7,在一实施例中,所述消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,所述服务器10包括:
第一写入模块101,用于所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
本实施例中,本发明在消息中间件的发送者和接收者两个方向分别放置基于共享内存的异步持久化组件,即发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件。
发送者将消息发送到网络后,将消息放入所述第一共享内存中,本地的所述第一异步持久化组件会读取该消息,并将所述消息写入所述第一异步持久化组件的磁盘。
第二写入模块102,用于所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
本实施例中,所述接收者从网络上接收到所述消息之后,先将所述消息放入所述第二共享内存,供所述第二异步持久化组件进行异步持久化进程,再递交给应用进行处理,此时,本地的第二异步持久化组件会将该消息写入磁盘。
读取模块103,用于在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
本实施例中,所述非关键慢接收者为处理速度较慢的非关键接收者,可以从接收者的预定磁盘中读取消息并递交给应用进行处理,从而将发送者和接收者解耦,而慢接收者并不会影响发送者。
本发明实现的消息中间件接收者可以配置两种模式:普通模式和慢接收者消息缓存模式。其中,对于处理速度正常的接收者,可以使用普通模式,应用处理消息与消息持久化并发进行;对于处理速度较慢的非关键接收者,可以使用慢接收者消息缓存模式,消息持久化与应用处理消息串行,也即先将消息写入磁盘,再从磁盘读取文件进行消息处理。可以理解的是,接收者从这两种模式中选择其中一种进行配置执行。具体地,
普通模式:消息回调线程获取到网络实时消息,先发给本地持久化组件进行异步持久化,然后再将消息指针放入应用队列中,应用队列的消息在应用处理之后释放消息。在这种模式下,如果应用处理消息速度较慢,则应用队列会被塞满,并最终造成消息丢弃和消息重传。
慢接收者消息缓存模式:相当于在无代理消息中间件的接收者内部实现了一个消息代理服务。接收者将网络实时消息放入本地持久化组件的共享内存后立刻返回并释放消息。消息中间件启动一个额外的异步持久化组件读取线程,从磁盘中获取消息并递交给应用处理。
发送模块104,用于在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
本实施例中,在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,也即消息仅缓存在发送者的本地持久化组件中,不再发送到网络中,从而避免网络拥塞;当检测到发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。如此,可以在接收者故障时,发送者缓存的消息可以用来补传接收者故障期间的消息。
可以理解的是,本发明中所述接收者异常的情况包括接收者中存在非关键慢接收者,或接收者中存在故障等。
本发明提供的服务器,通过发送者将消息发送至网络后,将所述消息放入第一共享内存,并在第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘,然后接收者从所述网络上接收到所述消息后,将所述消息放入第二共享内存,并在第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘,在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理,在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。如此,在满足高速消息中间件的超低时延要求的情况下,还能使局部故障、慢接收者不会影响整个分布式系统。
需要说明的是,在本文中,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者系统不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者系统所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括该要素的过程、方法、物品或者系统中还存在另外的相同要素。
上述本发明实施例序号仅仅为了描述,不代表实施例的优劣。
通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在如上所述的一个存储介质(如ROM/RAM、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,被控终端,或者网络设备等)执行本发明各个实施例所述的方法。
以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。
Claims (10)
1.一种消息中间件的接收者异常处理方法,其特征在于,所述消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,所述消息中间件的接收者异常处理方法包括以下步骤:
所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
2.如权利要求1所述的消息中间件的接收者异常处理方法,其特征在于,所述在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络的步骤包括:
在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的预设消息发送线程;
将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息;
在检测到发生故障的所述接收者恢复正常时,按照所述消息的发送顺序,通过所述预设消息发送线程将缓存的所述消息发送至所述网络,以发送至对应的接收者。
3.如权利要求2所述的消息中间件的接收者异常处理方法,其特征在于,所述在检测到所述接收者中存在故障时,为各个发生故障的所述接收者创建独立的所述预设消息发送线程的步骤之后还包括:
通过所述预设消息发送线程注册故障主题;
其中,所述将对应的所述发送者发送的消息进行缓存,并停止向所述网络发送消息的步骤包括:
获取所述发送者发送的对应所述故障主题的消息;
将对应所述故障主题的消息在所述第一异步持久化组件的作用下进行持久化处理,并停止向所述网络发送消息。
4.如权利要求3所述的消息中间件的接收者异常处理方法,其特征在于,所述通过所述预设消息发送线程注册故障主题的步骤之后还包括:
所述预设消息发送线程将所述故障主题添加到请求队列中;
从线程池中申请预设子线程,以处理接收者故障期的消息重传;
其中,所述获取所述发送者发送的对应所述故障主题的消息的步骤包括:
在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息。
5.如权利要求4所述的消息中间件的接收者异常处理方法,其特征在于,所述在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息的步骤之后还包括:
通过所述预设子线程调用对应的故障主题,所述预设子线程以阻塞方式向所述接收者发送所述历史消息。
6.如权利要求5所述的消息中间件的接收者异常处理方法,其特征在于,所述通过所述预设子线程调用对应的故障主题,向所述接收者发送所述历史消息的步骤之后包括:
在发生故障的所述接收者恢复正常时,通过所述预设子线程将所述历史消息发送至所述网络。
7.如权利要求5所述的消息中间件的接收者异常处理方法,其特征在于,所述在所述预设子线程启动后,获取所述预设子线程发送的对应所述故障主题的历史消息的步骤之后还包括:
获取所述预设子线程发送的对应所述故障主题的历史消息,与所述第一异步持久化组件持久化的历史消息之间的序列号差值;
在所述序列号差值小于预设阈值时,所述预设子线程以非阻塞方式向所述接收者发送所述历史消息。
8.一种服务器,其特征在于,所述服务器包括处理器以及存储在所述处理器内并可在所述处理器上运行的消息中间件的接收者异常处理程序,其中,所述消息中间件的接收者异常处理程序被所述处理器执行时实现如权利要求1至7中任一项所述的消息中间件的接收者异常处理方法的步骤。
9.一种服务器,其特征在于,消息中间件的发送者对应设有基于第一共享内存的第一异步持久化组件,接收者对应设有基于第二共享内存的第二异步持久化组件,所述服务器包括:
第一写入模块,用于所述发送者将消息发送至网络后,将所述消息放入所述第一共享内存,并在所述第一异步持久化组件的作用下,将所述消息写入所述第一异步持久化组件的磁盘;
第二写入模块,用于所述接收者从所述网络上接收到所述消息后,将所述消息放入所述第二共享内存,并在所述第二异步持久化组件的作用下,将所述消息写入所述第二异步持久化组件的磁盘;
读取模块,用于在检测到所述接收者中存在非关键慢接收者时,从所述接收者的预定磁盘中读取消息并递交给应用进行处理;
发送模块,用于在检测到所述接收者中存在故障时,将所述发送者发送的消息进行缓存,并停止向所述网络发送消息,在发生故障的所述接收者恢复正常时,将缓存的所述消息发送至所述网络。
10.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有消息中间件的接收者异常处理程序,所述消息中间件的接收者异常处理程序被处理器执行实现如权利要求1至7中任一项所述的消息中间件的接收者异常处理方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811379795.6A CN109710421B (zh) | 2018-11-16 | 2018-11-16 | 消息中间件的接收者异常处理方法、服务器及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811379795.6A CN109710421B (zh) | 2018-11-16 | 2018-11-16 | 消息中间件的接收者异常处理方法、服务器及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109710421A CN109710421A (zh) | 2019-05-03 |
CN109710421B true CN109710421B (zh) | 2020-12-08 |
Family
ID=66254951
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811379795.6A Active CN109710421B (zh) | 2018-11-16 | 2018-11-16 | 消息中间件的接收者异常处理方法、服务器及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109710421B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110377434A (zh) * | 2019-07-04 | 2019-10-25 | 深圳前海微众银行股份有限公司 | 一种服务熔断方法、装置及消息中间件 |
CN113905100A (zh) * | 2021-09-29 | 2022-01-07 | 济南浪潮数据技术有限公司 | 动态控制客户端重传请求的方法、系统、设备和存储介质 |
CN113849325A (zh) * | 2021-09-29 | 2021-12-28 | 四川新网银行股份有限公司 | 基于分布式消费信贷RabbitMQ熔断方法及系统 |
Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1760588A1 (en) * | 2005-09-02 | 2007-03-07 | Sap Ag | Event-based coordination of process-oriented composite applications |
CN102111419A (zh) * | 2011-03-07 | 2011-06-29 | 浙江大学 | 一种基于消息中间件的客户端自动重连方法 |
CN103209214A (zh) * | 2013-04-03 | 2013-07-17 | 蓝盾信息安全技术股份有限公司 | 一种基于NoSQL的消息中间件的实现方法 |
CN103428072A (zh) * | 2012-05-23 | 2013-12-04 | 北京大学 | 一种持久化消息的发布方法及系统 |
CN105068769A (zh) * | 2015-08-28 | 2015-11-18 | 浪潮软件股份有限公司 | 一种基于消息中间件的消息管理方法及装置 |
CN105338061A (zh) * | 2015-09-29 | 2016-02-17 | 华中科技大学 | 一种轻量级消息中间件的实现方法与系统 |
CN106598762A (zh) * | 2016-12-29 | 2017-04-26 | 上海理想信息产业(集团)有限公司 | 一种消息同步方法及系统 |
-
2018
- 2018-11-16 CN CN201811379795.6A patent/CN109710421B/zh active Active
Patent Citations (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
EP1760588A1 (en) * | 2005-09-02 | 2007-03-07 | Sap Ag | Event-based coordination of process-oriented composite applications |
CN102111419A (zh) * | 2011-03-07 | 2011-06-29 | 浙江大学 | 一种基于消息中间件的客户端自动重连方法 |
CN103428072A (zh) * | 2012-05-23 | 2013-12-04 | 北京大学 | 一种持久化消息的发布方法及系统 |
CN103209214A (zh) * | 2013-04-03 | 2013-07-17 | 蓝盾信息安全技术股份有限公司 | 一种基于NoSQL的消息中间件的实现方法 |
CN105068769A (zh) * | 2015-08-28 | 2015-11-18 | 浪潮软件股份有限公司 | 一种基于消息中间件的消息管理方法及装置 |
CN105338061A (zh) * | 2015-09-29 | 2016-02-17 | 华中科技大学 | 一种轻量级消息中间件的实现方法与系统 |
CN106598762A (zh) * | 2016-12-29 | 2017-04-26 | 上海理想信息产业(集团)有限公司 | 一种消息同步方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109710421A (zh) | 2019-05-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6247141B1 (en) | Protocol for providing replicated servers in a client-server system | |
CN109710421B (zh) | 消息中间件的接收者异常处理方法、服务器及存储介质 | |
CN110297801B (zh) | 基于容错fpga的事务系统的正好一次事务语义的系统和方法 | |
US7779418B2 (en) | Publisher flow control and bounded guaranteed delivery for message queues | |
US10491560B2 (en) | Message delivery in messaging networks | |
CN100596050C (zh) | 一种可靠的系统间消息通知方法和系统 | |
US9794305B2 (en) | Consistent messaging with replication | |
CN100591031C (zh) | 实现高可用性光纤信道交换机的方法和装置 | |
US7818386B2 (en) | Repeatable message streams for message queues in distributed systems | |
CN109669821B (zh) | 消息中间件的集群部分故障恢复方法、服务器及存储介质 | |
US9189303B2 (en) | Shadow queues for recovery of messages | |
US9319267B1 (en) | Replication in assured messaging system | |
CZ381198A3 (cs) | Zajišťování komunikačních spojů v počítačové síti | |
CN110413424B (zh) | 可配置的第三方消息回调方法、装置、服务器和存储介质 | |
JP2017502414A (ja) | 分散データグリッドにおいて非同期呼出をサポートするためのシステムおよび方法 | |
US9069632B2 (en) | Message processing | |
CN107453845B (zh) | 应答确认方法及设备 | |
CN109684128B (zh) | 消息中间件的集群整体故障恢复方法、服务器及存储介质 | |
US8094669B2 (en) | System and method for store and forward routing for distributed destinations | |
WO2017127310A1 (en) | Early thread return with secondary event writes | |
US11210089B2 (en) | Vector send operation for message-based communication | |
Gote et al. | Enhancing Resilience: A Solution Framework for Handling Third-Party Service Disruptions in FinTech Mobile Applications | |
CN118193232A (zh) | 实时任务同步通信方法、装置、电子设备及存储介质 | |
CN114500416A (zh) | 用于最多一次消息投递的投递方法和投递系统 | |
CN115203334A (zh) | 数据处理方法、装置、电子设备和存储介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |