一种基于消息的分布式系统以及在其中通信的方法

文档序号:7960212阅读:183来源:国知局
专利名称:一种基于消息的分布式系统以及在其中通信的方法
技术领域
本发明涉及网络通信领域,尤其涉及一种基于消息的分布式系统,以及在所述系统中利用消息通信的方法。
背景技术
随着IP(Internet Protocol,网际协议)网络的广泛延伸和带宽不断增长,网络提供了更大的能力,通过网络对系统进行分布部署,大大提高了系统的性能和灵活性,分布式软件系统架构是当今很多系统的基本特征。分布式作为一个系统级的架构,虽然对于不同的系统具有不同的考虑,但都有一个最基本需求,即分布式调用,具体地说,客户端和服务端可以分布在IP网络中,并且客户端和服务端的程序不必使用相同的编译环境和运行环境,如客户端可以使用java(一种计算机语言)编写,服务端使用C++(一种计算机语言)语言编写,客户端可以运行在基于Intel(美国英特尔公司)的CPU(中央处理器)的Windows(美国微软公司生产的“视窗”操作系统)环境,服务端运行在SUN Solaris(美国太阳公司生产的操作系统)上。
实现分布式调用需要考虑的几个关键的因素包括通信模式、对象解析、编码方式等。
通信模式对于比较复杂的系统各模块既是服务端提供服务,同时也是客户端使用其他模块的服务,通信模式是针对一个具体的场景,有如下模式远程过程调用—客户端发送请求给服务端,然后等待响应,即同步通信。
消息传递—客户机发送一个请求,并不期待一个响应。
异步回调—客户机以上述两种方式之一调用服务,双方交换角色,进行回调,这种模式可以以前述两种方式中的任一种构建。
对象解析由于系统模块的分布式部署,不再在一个进程甚至一个机器上,调用前必须有通信对象的名称,这个名称应该是逻辑上比较独立的,系统中保持唯一,不与物理资源绑定,避免在部署发生变化后需要修改程序,因此一般需要一个命名服务提供名字解析服务。如CORBA(Common Object RequestBroker Architecture,公共对象请求代理体系结构)使用名字(通过命名服务器)提供对象定位,DCOM(Distributed Component Object Model,分布式组件对象模型)使用系统注册提供名称服务,J2EE(J2EE是一个开放的、基于标准的开发和部署的平台)使用JNDI(JNDI,Java Naming and DirectoryInterface,Java命名和目录接口)提供名字服务。
编码方式通信双方由于不一定是使用相同的编程语言和具有相同的CPU,所以对字节序的理解不一样,如Java都是BigEndian(大端模式、高位优先、正向字序、网络字序、UNIX字序),C++语言在Intel上是LittleEndian(小端模式、低位优先、逆向字序、INTEL字序、NT字序),在PowerPC(一种个人台式计算机)上是BigEndian;除了字节序外,结构对象的内存排列(Layout)也不一致。分布式调用双方需要有一种一致的编码方式,常用的编码方式如AS N.1(Abstract Syntax Normal dot 1,一种使用比较广泛的数据编码规范)和CDR(Common Data Representation,公共数据表示,CORBA中使用的数据编码方式)。
在现有技术中,CORBA是很成熟的一种分布式开发技术。如图1所示,基于CORBA开发步骤通常可概括为1.用IDL(Interface Difinition Language,CORBA中用于描述接口的语言)文件定义客户端(Client)和服务端(Server)的应用编程接口(API);2.编译IDL文件,生成客户端代理(stub)代码、服务端骨架(skeleton)代码;3.在代理和骨架的基础上分别实现服务端和客户端。
其中,图中ORB(Object Remote Broker)Core是CORBA里面的对象远程代理核心。
然而,在上述现有的以CORBA作为分布式开发的技术中存在如下的缺点1.使用复杂,学习成本高。直接使用CORBA开发,需要学习的知识很多,对大多数的C++程序员来说,比较困难。
2.CORBA支持类似C++的调用方式,实现一般OO(Object Oriented,面向对象的)系统比较方便,但对于一些领域,需要并发处理大量消息,因此,通常不需要复杂的OO建模,而是需要异步传递消息和通知。
3.只支持单一的编码方式。使用CORBA技术时,在用户定义了IDL结构后,自动使用CDR编码,而对于一些移植系统,可能有其他的编码方式,如ASN.1,这时需要在IDL和其他编码方式之间作转换。
4.生成的代码量大,占用的内存和硬盘空间大。对于一些非服务器上的应用,如嵌入式单板,存储器容量有限,使用IDL定义接口导致大量的代码,这些代码要编译到系统中,造成目标文件很大。
5.无法在支持HA(高可用性)和LB(负载平衡)等电信要求。使用CORBA技术时,直接使用IDL定义接口,由于每个IDL直接编译成代码(包括编解码/通信处理),这些代码散布在系统各处,而且这些代码也是用户不能修改的,用户无法在一个地方进行统一处理,而HA、LB等高可用性要求系统能在一些点进行处理,如入口或出口。

发明内容
本发明的目的是提供一种基于消息的分布式系统,该系统可以降低分布式开发的难度。本发明还提出了一种在所述系统中利用消息进行通信的方法。
为此,本发明提供以下技术方案一种基于消息的分布式系统,所述系统包括至少一个节点,所述节点包括至少一个完成特定功能的模块,所述模块包括至少一个服务接入点,用于接收服务请求消息,并根据所述服务请求消息完成所需服务;消息发送器,用于将服务请求消息发送至目的服务接入点,请求所需服务。
所述服务接入点具有在所述系统内唯一的服务接入点标识;所述消息中包含目的服务接入点的标识。
所述消息发送器包括同步消息发送器,用于将同步消息发送至目的服务接入点,请求所需服务,并将服务结果返回给发送者;异步消息发送器,用于将异步消息发送至目的服务接入点,请求所需服务,但不负责将服务结果返回给发送者。
所述服务接入点包括至少一个服务执行单元,根据服务请求消息完成所需服务;消息接收和调度单元,接收服务请求消息,并分发给相应的服务执行单元,将服务结果返回给服务请求方。
所述消息接收和调度单元具体包括同步消息接收和调度单元,接收服务请求方的同步消息,调用相应的服务执行单元完成所需服务,将服务结果返回给服务请求方。
异步消息接收和调度单元,接收服务请求方的同步消息,并分发给相应的服务执行单元,待所述服务执行单元完成服务后,创建新消息,将服务结果放在所述新消息中通过消息发送器发送给服务请求方。
所述节点还包括名字服务器,用于提供名字服务;所述服务接入点将该服务接入点的标识及访问地址注册到所述名字服务器;所述消息发送器根据消息中的目的服务接入点标识从名字服务器得到目的服务接入点的访问地址,将消息发送至目的服务接入点。
所述消息包括消息头和消息体,所述消息头中至少包含发送所述消息的服务接入点标识,以及接收所述消息的服务接入点标识,所述消息体包含有服务需要的数据。
所述服务接入点标识由节点号、模块号和服务接入点号组成。
所述模块还设有一个备份模块。
所述模块还包括服务接入点列表存储器,用于存储所述模块中的所有服务接入点。
所述模块还包括一个服务接入点管理单元,用来管理所述模块中的所有服务接入点。
本发明还提供一种在分布式系统中利用消息进行通信的方法,用于第一服务接入点向第二服务接入点请求服务,所述方法包括以下步骤1)所述第一服务接入点通过消息发送器向所述第二服务接入点发送消息;
2)所述第二服务接入点接收消息,执行所需服务;3)所述第二服务接入点返回服务结果。
所述消息为同步消息,所述步骤2)具体为所述第二服务接入点接收消息,调用相应服务执行单元,完成所需服务。
所述消息为异步消息,所述步骤2)具体为所述第二服务接入点将所述消息发送给相应的服务执行单元,所述服务执行单元完成所需服务。
所述步骤3)具体为所述第二服务接入点创建新的消息,将服务结果放入所述新消息中,通过消息发送器发送给所述第一服务接入点。
所述消息包括消息头和消息体,所述消息头中至少包含发送所述消息的服务接入点标识,以及接收所述消息的服务接入点标识,所述消息体包含有服务需要的数据。
所述服务接入点标识由节点号、模块号和服务接入点号组成。
所述模块还设有一个备份模块,所述步骤1)具体为所述第一服务接入点通过消息发送器向第二服务接入点请求服务,所述消息发送器向位于所有模块的所述第二服务接入点分别发送请求所述服务的消息。
所述步骤3)具体为位于非备份模块的所述第二服务接入点返回服务结果。
由于本发明的系统采用了节点-模块-服务接入点的分层结构,发送消息统一使用消息发送器,接收消息统一使用服务点接入单元,用户不用关心系统的具体信息,只需要知道对端的接入服务点标识就能够完成在分布式环境下的通信,简化了分布式开发的步骤,降低了分布式开发的难度,提高了系统的可靠性,提高了系统的可扩充性,例如可以通过统一的消息处理支持统一的消息日志,实现HA方案。


图1是基于CORBA的通常开发步骤示意图;图2是本发明中所述系统的结构示意图;
图3是节点级联过程的流程图;图4是主节点与一个从节点级联时的名字服务结构示意图;图5是级联后主节点上看到的名字服务的目录树示意图;图6是级联后从节点上看到名字服务的目录树示意图;图7是根据本发明优选实施方案中节点的结构示意图;图8是用C++语言实现一个模块实例的结构示意图;图9是同步调用流程示意图;图10是异步调用流程示意图;图11是本系统在HA方案中应用的示意图。
具体实施例方式
下面结合附图和具体实施例对本发明作进一步说明,但不作为对本发明的限定。
图2是根据本发明优选实施方案的分布式系统的结构示意图。如图2所示,在系统内分布有多个节点,在节点中包括多个完成特定功能的模块。
本发明所述的节点分布在广域网内或局域网内。在图2中,节点1为主节点,其他节点是从节点,主节点是在逻辑上定义的,例如可以根据实际需要把其中一个独立的节点设置成主节点,其余节点设置成从节点。从节点和主节点通过级联的方式联合,这将在本文的下面进行详细描述。每个节点都有一个唯一的“节点号”,以和其他节点相区别。每个节点都包括一个名字服务器模块,所有从节点都注册到主节点的名字服务器模块上,节点间通过名字服务器模块级联访问。这将在下面进行详细描述。
图3描述了从节点的名字服务级联到主节点名字服务的过程。
如图3所示,在级联前,所有节点的名字服务器下都只有一个根目录节点Node0(节点0),级联过程可概括为步骤101在主节点名字服务的根下面创建一个目录节点Node1(节点1),并连接到自己的Node0;步骤102在主节点名字服务的根下面创建一个目录节点Node2(节点2),并连接到第一个从节点的Node0;步骤103在从节点名字服务的根下创建一个目录节点Primary(主目录节点),连接到主节点的根上;重复步骤102、103两步增加新的从节点,从节点号依次增加,如Node3、Node4、Node5......。
图4是主节点与一个从节点级联时的名字服务的结构示意图。
本领域的技术人员通过上面的描述和公知的常识,应该理解创建节点、目录节点以及这些节点如何通过名字服务器模块联合在一起的具体实现过程,因此,在这里不再赘述。
图5是级联后,从主节点的名字服务看到的名字服务目录树的示意图。在图6中,主节点名字服务目录树的根(Root)下有内容相同的Node0和Node1,Node1下是主节点的所有模块名目录,模块名目录下面是该模块所有服务接入点(SAP)的目录(在下文中将对SAP详细描述)。其他节点的目录连接在主节点名字服务目录树的根下,其结构与Node1相同,如图中的Node2、Node3。
图6是级联后,在从节点上的名字服务看到的名字服务目录树的示意图。该从节点的Root目录下有一个Node0,Node0下是该从节点的所有模块名目录,模块名目录下面是该模块所有SAP的目录。该从节点的根目录下还有一个Primary节点,在Primary节点下面连接着主节点和其他从节点的根目录。
图7是根据本发明优选实施方式的节点的结构示意图。图中,1、服务接入点,2消息发送器。如图7和图2所示,在该优选的实施方式中,各个节点中包括一个名字服务器以及多个完成特定功能的模块。每个模块都包括一个消息发送器2和至少一个服务接入点1。
在该实施方式中,消息发送器包括同步消息发送器和异步消息发送器。SAP则包括至少一个服务执行单元和消息接收和调度单元。消息接收和调度单元包括同步消息接收和调度单元。
SAP是模块对外的接口,都有一个在系统内唯一的SAP标识。SAP标识是对其进行访问的外部标识。SAP标识可以是系统内唯一的全局分层地址,具体地说,分层地址包括节点号、模块号、SAP号。模块的所有SAP都通过SAP标识注册到与其相对应的节点的名字服务器上。例如,在图6中,各模块以及其包含的SAP都挂在相应的Node0下面。此外,在名字服务模块上还记录了实际要访问地址(如物理地址)。在具体访问时,例如在访问时通过名字服务根据服务SAP的分层地址,得出它的实际访问地址,然后根据实际访问地址访问。
在模块中,SAP标识一般保存在特定位置,例如在本发明的一个实施方式中,SAP标识保存在模块中的一个专用的SAP列表存储器中。在系统初始启动时,模块会访问SAP列表存储器,并根据SAP存储器中的记录,对记录的SAP进行初始化。模块在关闭时会根据SAP存储器中的记录注销这些SAP。当然,本发明并不局限于此,本领域的技术人员应该理解还具有许多其他的存储方法。
同步消息发送器发送同步消息至目的SAP,请求所需服务,并将服务结果返回给发送者。异步消息发送器,发送异步消息至目的SAP,请求所需服务,但不负责将服务结果返回给发送者。同步消息接收单元接收服务请求方的同步消息,调用相应的服务执行单元完成所需服务,将服务结果返回给服务请求方。异步消息接收和调度单元,接收服务请求方的同步消息,并分发给相应的服务执行单元,待所述服务执行单元完成服务后,创建一个新的消息,将服务结果放在新的消息中通过消息发送器发送给服务请求方。
所述服务接入点在所述系统内具有唯一的全局分层地址都以其全局分层地址注册到名字服务器模块,消息发送器根据注册到名字服务器上的全局分层地址向服务接入点发送消息。由于采用了全局分层地址,不同节点中的模块也可以通过上述相同的方式互相进行访问。
在该实施方式中,同步消息和异步消息都包括消息头和消息体,消息头中至少包含客户端模块的地址、服务端地址以及服务端模块的SAP号,消息体则封装调用数据。
在下文中,为了便于描述,将发送消息的模块称为客户端模块,将接受消息的模块称为服务端模块。各模块既可以是客户端模块,也可以是服务端模块。
在进行同步调用时,客户端模块的消息发送器(具体地说,是通过同步消息发送器)向服务端模块的SAP发送同步消息。服务端模块通过其具有的SAP(具体地说,是接收和调度单元的同步接收和调度单元)接收该同步消息,并将所接收到的同步消息发送到相应的执行单元,执行单元根据接收到的同步消息的消息体中的具体内容来完成相应的功能操作,并将操作的结果返回到客户端模块。在这里返回的结果同样是由客户端模块的SAP的接收和调度单元来接收的。在进行异步调用时,客户端模块的消息发送器(具体地说,是通过异步消息发送器)向服务端模块的SAP发送异步消息,同样,服务端模块通过其具有的异步消息接收和调度单元接收该异步消息,并将所接收到的异步消息发送到相应的执行单元,该执行单元根据接收到的异步消息体中的具体内容来完成相应的功能操作。但是,服务端模块在完成相应的操作后,并不会给客户端模块返回操作结果。但是,服务端的SAP会从接收到的异步消息中获取客户端源地址,并对其进行保存。之后,客户端的SAP在任意需要的时候,可以创建新的消息,并将服务端模块的服务结果放入新的消息中,根据该客户端的源地址,向客户端模块返回操作的结果。在这里,在调用过程中所使用的数据可以是二进制数据,并可以使用分布式开发中的各种编码方式,例如使用CDR或ASN.1编码方式。
此外,各模块还可以包括一个管理SAP的单元,用来完成一些所有SAP的共性的管理功能。
在本发明的另外一个优选实施方式中,在节点中还可以设有一个备份模块,备份模块同原始模块完全相同,备份模块的模块号也同该模块的相同。在该实施方式中,上述分层地址还可包括一个“群内号”,用于区分原始模块和备份模块。
下面描述一种在根据本发明上述实施方式描述的分布式系统中利用消息进行通信的方法。
首先,上述节点中的一个(在这里称为第一节点)的一个模块(在这里称为第一模块)通过与其对应的消息发送器向另外一个节点(在这里称为第二节点)的一个模块(在这里称为第二模块)发送消息。第二模块通过与其对应的SAP接收该消息,并根据所接受的消息是同步消息还是异步消息来执行相应操作。其中在第一模块向第二模块发送的消息为同步消息时,第二模块向第一模块返回操作结果,在第一模块向第二模块发送的消息为异步消息时,第二模块根据所述消息执行相应操作,但不向第一模块返回操作结果,而仅保存第一模块的地址。在需要的时候,第二模块可以根据包括的第一模块的地址向第一模块返回操作结果。对于具体的操作过程可参照上文中的描述。
在这里虽然列举了两个节点之间的两个模块之间进行通信的方法,但是本领域的技术人员应该认识到在同一节点中的两个不同模块也可以进行上述相同的操作。此外,对于上述操作的具体原理和细节已经在前面描述本发明优选实施方式的分布式系统时进行了详细的论述,因此,在这里不再赘述。
为了使本领域的技术人员更加完整地理解本发明,下面以C++语言编程为例来详细描述实现本发明优选实施方式的模块的细节。
为了使本发明的技术人员更容易地理解本发明,下面将以C++语言编程为例以软件实现的形式来说明本发明实施方式的一个示例。图8是用C++语言编程实现一个模块的实例的结构示意图。在图中,iMAP_Lem_Module表示模块的类名称,iMAP_Msg_Utility表示消息发送器的类名称,iMAP_Sap_Cache_Mgr和Sap_Entry分别表示服务接入点缓存管理器的类名称和服务接入点列表的类名称。此外,iMAP_Lem_Sap_Impl和iMAP_Admin_Sap_Impl分别表示服务接入点实现基类的类名称和管理服务接入点实现的类名称。图中的连线表示了各类之间的调用关系。图中的英文是访问时调用的名称,没有特别的含义,也可以用其他的英文名称替代。
其中,各模块可以通过包含有进程、动态库或其他形式的单元来实现,如前所述,每个模块都有一个唯一的“模块号”,用于和节点内其他模块相区别。这些模块作为SAP的容器完成模块全局的初始化和SAP的初始化。模块主体通过消息发送器向其他模块的SAP发送消息来访问其他模块。如上所述,服务接入点缓存管理器由消息发送器使用。服务接入点列表用于存储该模块中所有的SAP地址,服务接入点列表在模块初始化时被初始化。管理服务接入点实现类,可以完成一些所有SAP的共性的管理功能。
SAP从iMAP_Lem)_Sap_Impl派生。SAP提供模块对外接口的实体,SAP有一个唯一的“SAP号”,和本模块的其他SAP相区别。SAP实现一个CORBA接口,并注册到名字服务器,使用[节点号][模块号][SAP号]来作为该SAP的外部标识(名字)。
SAP实现的CORBA接口为一个通用的接口,而应用层的SAP一般会提供多个功能,每个功能用一个成员函数实现。应用定义成员函数,同时定义一个分发ID(分发码)。iMAP_Lem_Sap_Impl通过分发ID查找和调用分发成员函数。成员函数使用宏定义。
上述模块类和SAP类封装了服务端的开发,消息发送器提供了客户端的使用,客户端使用这个类对象发送同步或异步消息。
模块类和SAP类中都有获得iMAP_Msg_Utility实例的函数。消息发送器的关键是SAP缓存管理器iMAP_Sap_Cache_Mgr,该类提供SAP的CORBA对象的缓存。这个类的核心是一个SAP的缓存数组。
从上述内容不难看出,本实例中的技术方案简化了分布式开发的步骤,降低了分布式开发的难度,由于iMAP_Lem_Module封装了CORBA对象的创建和注册、注销,用户只要专注于SAP的实现;SAP只是一个普通的C++类,从iMAP_Lem_Sap_Impl派生,用户只需要定义分发码和实现成员函数,而不需要定义和实现任何CORBA接口。而发送消息统一使用iMAP_Msg_Utility类,用户也不用关心对端的CORBA对象和名字服务器,只需要知道对端的SAP标识。
本实例中的方案提供了更好的扩充性和可靠性,由于发送消息统一在iMAP_Msg_Utility中实现,消息接受统一在iMAP_Lem_Sap_Impl中,消息有统一的消息头,可以对消息进行一些统一的处理,进行一些AOP(AspectOriented Programing,面向方面的编程),如统一记录日志。由于消息统一入口、出口和消息头,可以统一记录运行日志。
此外,如果直接使用CORBA开发,对每个接口定义一个IDL,然后编译成stub(代理)和skeleton(骨架),这些代码量很大,一个简单的接口可能编译出1000行以上代码,造成系统很庞大,在本实施例中,只有一个系统预定义的CORBA接口,新增的功能通过用户派生类实现自己的业务逻辑,没有额外的代码,系统的大小可以控制,在一些嵌入式的系统由于内存受限制,可以通过本发明提供的方案实现很好的分布式特性。
上述实例中,可以使用ORB(CORBA里面的对象远程代理)进行底层的通信承载,但在本发明的系统中ORB不是必须的,也可以使用其他方式作为通信的承载。包括但不限于ACE Reactor/EventHandler(ACE Reactor,Adaptive Communication Envionment Reactor/EventHandler,自适应通信环境反应器/事件处理器;是ACE里面的一个设计模式,对Socket-即套接字的一种C++封装,ACE是一套开源代码。);ICE(Internet CommunicationEnvironment,因特网通信环境,也是一套开源代码,是CORBA的简化版本);Socket(套接字,是针对IP通信的最广泛使用的一套编程接口)等,都可以实现本发明的系统。
图9表示本方案的一个同步调用的过程。下面参照图8和图9详细描述本发明一个实施方式的同步调用过程,其步骤如下步骤901Client(客户端,即调用者)使用消息发送器(iMAP_Msg_Utility)发送同步消息(Send_sync_msg,消息发送器提供的接口函数);步骤902iMAP_Msg_Utility对Server(服务端)的iMAP_Lem_Servant(侍服类)执行同步调用(InvokeSnyc,同步调用,底层CORBA接口调用);步骤903iMAP_Lem_Servant对iMAP_Lem_Sap_Impl执行同步调用(iMAP_Lem_Servant实际和iMAP_Lem_Sap_Impl可以是一个类,分成两个仅仅是一种实现上的解耦方法,可以看成是一个,前者仅起一个代理作用);步骤904iMAP_Lem_Sap_Impl在映射中查找分发函数(find_map,分发函数,是服务接入点类的一个成员函数),服务接入点根据消息头中的分发码,找到分发函数;步骤905iMAP_Lem_Sap_Impl执行分发函数;步骤906iMAP_Lem_Sap_Impl同步调用结束,将该调用的输出参数和返回值返回给iMAP_Lem_Servant;步骤907iMAP_Lem_Servant同步调用结束,将该调用的输出参数和返回值返回给iMAP_Msg_Utility(即Send_sync_msg函数的输出参数和返回值);步骤908iMAP_Msg_Utility同步消息结束,Client获得调用结果。
图10表示了本方案的一个异步调用的过程实例,下面参照图8和图10详细描述本发明一个实施方式的异步调用过程,其步骤如下步骤1001Client(客户端,即调用者)使用消息发送器(iMAP_Msg_Utility)发送异步消息(send_async_msg,消息发送器提供的接口函数);步骤1002iMAP_Msg_Utility对Server(服务端)的iMAP_Lem_Servant(侍服类)执行异步调用(InvokeAsync,异步调用,底层CORBA接口调用);步骤1003iMAP_Lem_Servant对iMAP_Lem_Sap_Impl执行异步调用;步骤1004iMAP_Lem_Sap_Impl在映射中查找分发函数;步骤1005iMAP_Lem_Sap_Impl不执行分发函数,把调用打包放进队列。打包放进队列过程是把找到的分发函数指针、异步调用的消息头和消息体放在一个数据结构里面,然后把这个结构放进一个队列;步骤1006iMAP_Lem_Sap_Impl异步调用结束,将返回结果(不带有该调用的输出参数和返回值)返回给iMAP_Lem_Servant;步骤1007iMAP_Lem_Servant异步调用结束,将返回结果(不带有该调用的输出参数和返回值)返回给iMAP_Msg_Utility;步骤1008iMAP_Msg_Utility异步消息结束,将返回结果返回给Client。
步骤1009iMAP_Lem_Sap_Impl通过Svc(线程函数)论询上述队列,如果队列不为空,则取出队列的内容(分发函数指针、消息头、消息体),通过分发函数指针,执行该分发函数,执行时消息头、消息体作为分发函数的参数传入。
步骤1010Svc(线程函数)获得步骤1009中分发函数执行的结果,结果包括两部分函数返回值,函数输出参数。
步骤1011Svc使用Server(服务端)的iMAP_Msg_Utility的异步函数(send_async_msg)给Client发送结果(返回值填在消息头中,输出参数作为消息体);Client端实际也是在一个iMAP_Lem_Sap_Impl的实现里面处理步骤1011的结果。
此处还需要规定一个特殊值比如发函数如果返回空值(DISP VOID),表示不需要Svc函数再执行步骤1011,将返回空值作为一个特殊定义,分发函数的其他返回值不能使用这个值。
当Client的iMAP_Lem_Sap_Impl在收到Server的iMAP_Msg_Utility发送的消息后,Client端的iMAP_Lem_Sap_Impl的分发函数会返回空值,从而避免形成一个死循环的消息发送。
图11表示本方案的一种在HA上的应用实例。如图中所示,在HA方式中,模块有两个运行实例,一个是主(Active),一个是备(Standby),这两个实例的节点号、模块号都一样,但两个的“群内号”不一样,如,一个是0一个是1。对于调用者,他只看到节点号、模块号、SAP号,因此HA对于调用者是透明的。调用者把目的节点号、模块号、SAP号传给消息发送器,后者在调用时中查询这两个实例的状态,如果发现一个是主,一个是备,则给主和备实例同时发送(即同时调用主和备实例的SAP的CORBA函数),这样实现复制功能(Duplication function)。
这是实现双机热备份的一种机制,也叫做并发选收。即发送的时候给主备对象都发送,但主、备对象处理后,只有主的返回消息发出来(如果两个的消息都发出来就会造成混乱),而备的消息不发出来,如图中虚线部分,这样实现选择功能(selection function)。
如此,可以保证在主、备对象中,如果有一个死了,另外一个还能不中断地进行处理。比如当主对象死了,这时原先备的对象变成了主对象,可以发送消息,而原先的主对象变成了备对象。
主、备作为整体来讲,始终有一个输入和一个输出。输入和输出包括任何内容,当对应文件时,输入就是读文件,输出就是写文件;当对应数据库时,输入就是查询,输出就是增删改。
以上所述的实施例,只是本发明较优选的具体实施方式
的一种,本领域的技术人员在本发明技术的方案范围内进行的通常变化和替换,都应包含在本发明的保护范围内。
权利要求
1.一种基于消息的分布式系统,其特征在于,所述系统包括至少一个节点,所述节点包括至少一个完成特定功能的模块,所述模块包括至少一个服务接入点,用于接收服务请求消息,并根据所述服务请求消息完成所需服务;消息发送器,用于将服务请求消息发送至目的服务接入点,请求所需服务。
2.如权利要求1所述的系统,其特征在于,所述服务接入点具有在所述系统内唯一的服务接入点标识;所述消息中包含目的服务接入点的标识。
3.如权利要求1所述的系统,其特征在于,所述消息发送器包括同步消息发送器,用于将同步消息发送至目的服务接入点,请求所需服务,并将服务结果返回给发送者;异步消息发送器,用于将异步消息发送至目的服务接入点,请求所需服务,但不负责将服务结果返回给发送者。
4.如权利要求1所述的系统,其特征在于,所述服务接入点包括至少一个服务执行单元,根据服务请求消息完成所需服务;消息接收和调度单元,接收服务请求消息,并分发给相应的服务执行单元,将服务结果返回给服务请求方。
5.如权利要求4所述的系统,其特征在于,所述消息接收和调度单元具体包括同步消息接收和调度单元,接收服务请求方的同步消息,调用相应的服务执行单元完成所需服务,将服务结果返回给服务请求方。异步消息接收和调度单元,接收服务请求方的同步消息,并分发给相应的服务执行单元,待所述服务执行单元完成服务后,创建新消息,将服务结果放在所述新消息中通过消息发送器发送给服务请求方。
6.如权利要求2所述的系统,其特征在于,所述节点还包括名字服务器,用于提供名字服务;所述服务接入点将该服务接入点的标识及访问地址注册到所述名字服务器;所述消息发送器根据消息中的目的服务接入点标识从名字服务器得到目的服务接入点的访问地址,将消息发送至目的服务接入点。
7.如权利要求2所述的系统,其特征在于,所述消息包括消息头和消息体,所述消息头中至少包含发送所述消息的服务接入点标识,以及接收所述消息的服务接入点标识,所述消息体包含有服务需要的数据。
8.如权利要求2所述的系统,其特征在于,所述服务接入点标识由节点号、模块号和服务接入点号组成。
9.如权利要求1所述的系统,其特征在于,所述模块还设有一个备份模块。
10.如权利要求1所述的系统,其特征在于,所述模块还包括服务接入点列表存储器,用于存储所述模块中的所有服务接入点。
11.如权利要求1所述的系统,其特征在于,所述模块还包括一个服务接入点管理单元,用来管理所述模块中的所有服务接入点。
12.一种在分布式系统中利用消息进行通信的方法,用于第一服务接入点向第二服务接入点请求服务,其特征在于,所述方法包括以下步骤1)所述第一服务接入点通过消息发送器向所述第二服务接入点发送消息;2)所述第二服务接入点接收消息,执行所需服务;3)所述第二服务接入点返回服务结果。
13.如权利要求12所述的方法,其特征在于,所述消息为同步消息,所述步骤2)具体为所述第二服务接入点接收消息,调用相应服务执行单元,完成所需服务。
14.如权利要求12所述的方法,其特征在于,所述消息为异步消息,所述步骤2)具体为所述第二服务接入点将所述消息发送给相应的服务执行单元,所述服务执行单元完成所需服务。
15.如权利要求14所述的方法,其特征在于,所述步骤3)具体为所述第二服务接入点创建新的消息,将服务结果放入所述新消息中,通过消息发送器发送给所述第一服务接入点。
16.如权利要求12所述的方法,其特征在于,所述消息包括消息头和消息体,所述消息头中至少包含发送所述消息的服务接入点标识,以及接收所述消息的服务接入点标识,所述消息体包含有服务需要的数据。
17.如权利要求12所述的方法,其特征在于,所述服务入点标识由节点号、模块号和服务接入点号组成。
18.如权利要求17所述的方法,其特征在于,所述模块还设有一个备份模块,所述步骤1)具体为所述第一服务接入点通过消息发送器向第二服务接入点请求服务,所述消息发送器向位于所有模块的所述第二服务接入点分别发送请求所述服务的消息。所述步骤3)具体为位于非备份模块的所述第二服务接入点返回服务结果。
全文摘要
本发明提出了一种基于消息的分布式系统以及在其中进行通信的方法,所述系统包括至少一个节点,所述节点包括至少一个完成特定功能的模块,所述模块包括至少一个服务接入点,用于接收服务请求消息,并根据所述服务请求消息完成所需服务;消息发送器,用于将服务请求消息发送至目的服务接入点请求所需服务。利用本发明,发送消息统一使用消息发送器,接受消息统一使用服务点接入单元,用户不用关心具体信息,只需要知道对端的接入服务点标识就能够完成在分布式环境下的通信,简化了开发的难度,提高了系统的可靠性和可扩充性。
文档编号H04L29/08GK1984149SQ20061007598
公开日2007年6月20日 申请日期2006年4月27日 优先权日2006年4月27日
发明者徐彬艳 申请人:华为技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1