一种多模块健康检测方法

文档序号:7622816阅读:188来源:国知局
专利名称:一种多模块健康检测方法
技术领域
本发明涉及多模块通讯系统,尤其涉及多模块检测技术。
背景技术
移动通讯系统中,控制面的定位业务需要GMLC实体实现。GMLC实体既要通过IP连接接入LCS Client,又要通过信令方式访问核心网的基本网元,所以GMLC实体在实现中需要内部划分为IP接入模块和信令网关模块。这两个模块在不同的硬件上部署,通过消息中间件通讯。在业务实际运行中,考虑系统的稳定性和可扩展性,这两种模块都需要能够进行负载平衡,也就是说,IP接入模块和信令网关模块都需要能够进行多模块的部署。尤其是信令网关,它直接和核心网相连,占用信令资源,如果没有多模块的部署,一旦控制面定位业务量较大时,会对信令网络产生影响,进而影响其他的数据和话音业务。
每一个IP接入模块和信令网关模块都使用模块号进行编码,消息中间件使用模块号路由这些消息。这些消息中间件和具体的模块部署在同一个硬件实体上,这样避免使用一个集中的消息网关,也就避免了单点故障的产生。
这些模块之间为了实现负载平衡,每一个模块上都需要维护一个全局的模块列表。而维护这个列表的功能必须是动态的。不论是IP接入模块还是信令网关模块中哪一个出现异常,都需要能够动态的退出这个列表,也需要能够在恢复正常后动态地重新加入列表。
现有技术中,所述维护模块列表的功能是通过健康检测消息来实现的。现有的处理方式一般是每一方都主动向对方发送健康报告,这种现有的方法尽管可以实现维护模块列表的功能,但是网络流量加大,实现变得复杂。

发明内容
本发明的目的是提出一种多模块健康检测方法,使用Client/Server结构的通讯方式,只由一方发起健康检测。
本发明采用以下技术方案,一种多模块健康检测方法,用于至少两方相互通讯的模块,所述至少两方模块均使用模块号进行唯一标识,通过消息中间件通讯,该健康检测方法包括以下步骤步骤一,首先在发起模块中维护一个第一列表,该第一列表中的每一表项至少包括接收模块的接收模块号和最后响应时间,由发起模块定时向第一列表中的所有接收模块发起约定的健康检测消息,该健康检测消息中标识发起模块号并被消息中间件路由到接收模块;步骤二,接收模块维护一个第二列表,该第二列表中的每一表项至少包括发起模块的发起模块号和最后发送时间,当接收模块收到健康检测消息时,从消息体中取出发起模块号,若该发起模块号在第二列表中已经存在,就修改表项中的最后发送时间;否则增加一个表项,填写刚接收到的健康检测消息的消息体中携带的发起模块号和最后发送时间;步骤三,接收模块创建健康检测响应消息,消息体中填写接收模块号;该健康检测响应消息通过消息中间件被路由到发起模块;步骤四,发起模块收到健康检测响应消息后,根据消息体中的接收模块号从第一列表中找出对应的表项,修改其中的最后响应时间;若在第一列表中未找到对应的表项,则增加一个表项,填写健康检测响应消息中携带的接收模块号和最后响应时间;进一步地,双方模块在向对方模块发送非健康检测消息或非健康检测响应消息时,先从本地列表即第一列表或第二列表中选取一个健康的对方模块。
进一步地,健康模块的判断标准即最后响应时间或最后发送时间与当前时间的差值是否超过一定的阈值。
进一步地,所述发起模块和接收模块均包含多个实例模块,一方模块中的一个实例模块可以和另一方模块中的所有实例模块进行通讯。
进一步地,初始时第二列表可为空。
进一步地,第一列表和/或第二列表采用先进先出队列。
和现有技术相比,采用本发明方法可以提高整个系统的可用性,不论系统中的哪一个模块出现异常,都不会使整个系统瘫痪。由于模块列表可以动态维护,可实现系统模块的热插拔。具有稳定可靠和扩展性佳的特点,很容易复用到各种需要多模块通讯的分布式环境中。


图1是应用本发明的系统架构示意图;图2是本发明实施例中发起模块的处理流程图;图3是本发明实施例中接收模块的处理流程图;图4是本发明实施例中取出一个可用模块的处理流程图。
具体实施例方式
消息中间件是对一类可以根据消息通讯双方的标识进行消息转发的软件模块,其特征在于屏蔽了消息通讯双方的物理位置以及和具体通讯协议相关的IP地址之类的底层技术,而代之以统一编程接口,以及消息结构定义,统一的模块号定义、消息标识等。
模块号的定义可以使用水平分段的分配方案,也可以使用分层的有结构的分配方案。使用水平分段的分配方案时,系统中每一个物理机器上只能部署一个模块。使用分层的有结构的分配方案时,每个物理机器上可以部署多个模块,每个模块的模块号中的前缀相同,但是使用有不同的子模块号,模块号的前缀仍然需要全局统一分配,字模块号却可以单独分配,但是需要在通讯时明确指定,也就是说,子模块号尽管可以随意指定,但是通讯的双方都需要明确的知道这个标识。模块号和子模块号可以使用数字,字符串等各种表达方式,当使用数字来表达的时候,可以根据整个系统中可能支持的模块的数量决定使用多少位长的模块号,比如,使用一个字节来表示模块号,系统最多支持256个模块,使用两个字节来表示的时候,最多可以支持65536个模块,依此类推。
在相互通讯的两个模块之间使用预先定义好的消息号来表示各种不同的消息。不同消息的消息结构各不相同,但是都要包含一个消息号。只要指明了消息号,也就确定了消息的结构以及处理的方式。消息号可以使用数字和字符串来表示,但是必须全局唯一。
这些消息号对于消息中间件来说是没有意义的,发送端的消息中间件只关心消息需要发送的目的地的模块号,以及消息的长度,接收端根据消息长度从双方的连接中读出消息,并且转发给目的模块。
健康检测消息就是具有特殊消息号的消息,其结构中只要包含消息号和发出消息的模块号这两个字段就够了。健康检测响应消息同样有自己的消息号,其结构也至少包括两个字段一是消息号,一是返回响应的模块的模块号。
下面结合附图对技术方案的实施作进一步的详细描述。
图1是应用本发明的系统架构示意图,从图1中可以看出,在整个系统中有两类模块,一类为检测消息发送模块即发起模块,一类为检测消息响应模块即接收模块。发起模块和接收模块之间都通过消息中间件相互通讯。由于没有使用单一的消息网关,所以这种架构避免了出现单点故障。所有的模块都使用模块号做唯一标识。它们在发送消息时,不再依赖于底层的通讯协议所使用的标识,不需要配置IP地址等参数,只要确定对方的模块号就可以向对方发送消息。这种方式隔离了底层的通讯实现技术,具有更大的灵活性。
系统中不仅有两类模块,而且这两类模块都分别有多个实例,某一类模块中的一个实例模块可以和另一类模块中的所有实例模块进行通讯,对于这个实例模块来说,就实现了分布式的负载均衡。
在使用了模块号作为唯一标识之后,对系统中的每一个模块而言,实现这种负载均衡,就是在运行时能够向某一个模块号发送消息,而且保证这个模块是可用的,并且所有的可用模块在一种均衡策略算法的支持下能够被遍历到。最简单的遍历策略就是轮询的方式。本发明实施例就使用轮询的实现方式。其实,对于本发明健康检测方法来说,选取何种遍历模块的方式并不重要,只是在讨论健康检测的结果对选取模块的影响时,需要使用一种具体的遍历方式加以说明而已,对于其它遍历方式,本发明健康检测方法仍然有效。
本实施例假设检测消息发送方模块即发起模块和检测消息接收方模块即接收模块都使用轮询的方式来选取模块,模块中保存模块列表的方式是采用先进先出队列FIFO。
如图2所示,描述了发起模块如何通过健康检测来维护发起模块中的列表即第一列表。
初始时,在发起模块的先进先出队列即第一列表中保存每一个接收模块对应的表项,表项至少包含两个字段,一是接收模块号,一是时间戳,即检测消息的响应时间,初始时这个时间就是消息发出的时间,以确保此时这个模块被判断为可用。
发起模块使用一个定时器以周期性的向每一个接收模块发送健康检测消息。
发起模块在向接收模块发送健康检测消息之前,先从第一列表中取出所有的接收模块号。该操作要求一次性地将第一列表中的所有元素拷贝一份,然后将拷贝之后的表项中的每一个模块号取出,存放到一个新的数组中去。由于这个结果对顺序并不关注,所以整个过程中不需要特别的加锁。
发起模块取出所有接收模块号之后,为每一个模块组装一个检测消息,实际上这些检测消息的格式相当简单,因为其中只包含了发起模块的模块号。这样做的原因,一方面是在轮询的方式下这样已经足够了,而且这样可以最大限度的减少检测消息的大小,从而减少对网络通讯的影响,尽量提高整个系统的效率。
上述检测消息实际上是发往消息中间件,所以只要额外指明消息的目的地的模块号就可以,而消息的路由工作将由消息中间件来完成。即使是由于消息中间件之间的某种原因导致消息不能送达,而不是对方模块出现故障,在本实施例的健康检测的机制下,模块列表的维护的功能仍然可以实现。
对于发起模块来说,检测消息的发送是周期性的进行的,一旦定时器到时,上述步骤都会重新执行一遍。
下面再结合图3来说明检测消息的响应方模块即接收模块如何通过健康检测来维护它们本地的模块列表即第二列表。
首先,接收模块也要准备一个先进先出的队列即第二列表,初始时第二列表可以为空。一旦一个检测消息到达,接收模块先从消息中取出发起模块号,并根据该发起模块号到队列中进行查找。
查找的过程实际上也是一个遍历的过程,首先是将整个先进先出队列中的所有表项加以拷贝,并对拷贝后的数组循环操作,第二列表表项中定义的字段和第一列表表项的定义相似,同样是保存对方的模块号和时间戳,只是这里的时间戳是最后一次收到检测消息的时间。判断工作就是比较每一个表项中的模块号和收到的检测消息中取出的模块号是否相等。这里的操作是首先将所有的表项加以拷贝,所以将这一步实现为原子操作就可以避免对队列顺序的影响。
如果找到了对应的表项,那么检测消息响应方模块就刷新表项中的时间戳,否则就新增一个表项,其中的模块号填写为收到的检测消息中取出的模块号,时间戳填写为当前时间,并将这个表项加入到先进先出队列即第二列表的尾部。
接着,接收模块为这条检测消息组装响应消息,响应消息的结构同样只需要包含模块号就够了。这里的模块号填写为响应方的模块号即接收模块号。响应方即接收模块同样向消息中间件发送这条消息,并且只需要额外指明消息接收方的模块号就可以,具体的路由工作由消息中间件来完成。
再重新回到图2来说明检测消息发送方即发起模块收到健康检测响应消息之后的操作。
发起模块收到健康检测响应消息之后,和接收模块收到健康检测消息的处理方式完全类似,首先取出消息中包含的接收模块号,在第一队列中进行查找,如果找到对应表项的话,就刷行该表项的时间戳,否则,在列表中新增一个表项,其中的模块号填写为收到的响应消息中携带的接收模块号,时间戳填写为当前时间。
查找的方法前面已经说明,不再赘述。
接下来,再结合图4说明每一个模块如何利用本地模块列表即第一列表或第二列表来实现分布式负载均衡的。同时说明,如何在选取模块时保证已失效的模块不再被选中。
当某一个模块要向另一方模块发送非健康检测消息时,它首先要从本地模块列表中选取一个对方模块。当然选取的标准是要求对方模块是处于激活状态的。由于前面的健康检测过程中记录了每次收到对方模块检测或者应答消息的时间,那么可以通过这个时间和当前时间的差是否超过一定阈值来判断对方模块是否处于激活状态。
由于第一列表和第二列表使用的是先进先出队列,所以操作时总是从队列头中取出一个表项,判断相应模块的状态后,再将它重新加入表尾。也就是说这个操作是不会破坏整个队列的顺序的。而且这里要着重说明的是,这个操作要作为一个原子操作来对待,也就是说,在整个操作开始之前,要对一个信号量加锁,在遍历完队列之后,再对信号量解锁,这样可以保证在整个操作过程中不会被其它的线程所打断,也就可以保证队列顺序的正确性。
在遍历过程中,如果找到一个处于激活状态的模块,就可以返回这个模块号,但是返回之前还需要将表项重新加入表尾。如果整个遍历过程没有找到处于激活状态的模块,或者说所有的模块当前都是不可用的,那么需要由系统指定一个专门的缺省模块作为返回值,或者报告异常。
本发明实施例既涉及到模块列表维护中模块的动态退出的功能,又涉及到模块的动态加入的功能。所以这是一个简单而完善的实现方案,可以在此基础上实现各种分布式负载均衡的功能。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,比如修改保存模块队列的数据结构、使用不同的选取模块的算法、修改检测消息的格式、修改检测时间戳的方式等等。但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
权利要求
1.一种多模块健康检测方法,用于至少两方相互通讯的模块,所述至少两方模块均使用模块号进行唯一标识,通过消息中间件通讯,该健康检测方法包括以下步骤步骤一,首先在发起模块中维护一个第一列表,该第一列表中的每一表项至少包括接收模块的接收模块号和最后响应时间,由发起模块定时向第一列表中的所有接收模块发起约定的健康检测消息,该健康检测消息中标识发起模块号并被消息中间件路由到接收模块;步骤二,接收模块维护一个第二列表,该第二列表中的每一表项至少包括发起模块的发起模块号和最后发送时间,当接收模块收到健康检测消息时,从消息体中取出发起模块号,若该发起模块号在第二列表中已经存在,就修改表项中的最后发送时间;否则增加一个表项,填写刚接收到的健康检测消息的消息体中携带的发起模块号和最后发送时间;步骤三,接收模块创建健康检测响应消息,消息体中填写接收模块号;该健康检测响应消息通过消息中间件被路由到发起模块;步骤四,发起模块收到健康检测响应消息后,根据消息体中的接收模块号从第一列表中找出对应的表项,修改其中的最后响应时间;若在第一列表中未找到对应的表项,则增加一个表项,填写健康检测响应消息中携带的接收模块号和最后响应时间。
2.根据权利要求1所述的方法,其特征在于,双方模块在向对方模块发送非健康检测消息或非健康检测响应消息时,先从本地列表即第一列表或第二列表中选取一个健康的对方模块。
3.根据权利要求2所述的方法,其特征在于,健康模块的判断标准即最后响应时间或最后发送时间与当前时间的差值是否超过一定的阈值。
4.根据权利要求1所述的方法,其特征在于,所述发起模块和接收模块均包含多个实例模块,一方模块中的一个实例模块可以和另一方模块中的所有实例模块进行通讯。
5.根据权利要求1所述的方法,其特征在于,初始时第二列表可为空。
6根据权利要求1或5所述的方法,其特征在于,第一列表和/或第二列表采用先进先出队列。
全文摘要
本发明旨在提供一种多模块健康检测方法,包括以下步骤在发起模块中维护第一列表,每一表项至少包括接收模块号和最后响应时间,发起模块定时向第一列表中的所有接收模块发起约定的健康检测消息;接收模块维护第二列表,每一表项至少包括发起模块号和最后发送时间;接收模块创建健康检测响应消息,消息体中填写接收模块号;发起模块收到健康检测响应消息后,维护第一列表。双方模块在向对方模块发送非健康检测消息时,先从本地列表中选取一个健康的对方模块。本发明方法可以提高整个系统的可用性。
文档编号H04Q3/00GK1956442SQ20051009502
公开日2007年5月2日 申请日期2005年10月26日 优先权日2005年10月26日
发明者吕吉, 单良 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1