史旭东 国网新疆电力公司电力科学研究院 乌鲁木齐 830000
【文章摘要】
Ice中间件集成了分布式运算环境, 利用Ice 提供的load balancing 功能,把M 个规约处理请求合理的分配到N 个规约服务上,并在不影响用电信息采集系统运行的情况下实现规约服务实例及规约处理应用的动态增减。基于Ice 的分布式规约服务,具备负载均衡能力、很好的可伸缩性及灾难冗余能力。
【关键词】
用电信息采集系统;规约服务;分布式系统;Ice
0 引言
分布式计算是近年提出的一种新的计算方式,通过分布式计算模式将具体的工作分散到通过网络连接起来的多台计算机上处理,从而达到共享资源、提高性能、灾难冗余及均衡负载的目的。
中间件技术的引入使得分布在网络中的客户机和服务器能够各自专注于实现自己的功能。当客户机想要调用服务器上的一个操作时,它只需发出自己的请求,而不用关心服务器哪里,它不必关心,服务器是否正常,压力多大等。这一切都留给中间件来处理。基于面向对象的中间件技术,更适合用于构建一个大规模、分布式,具有异构性和可扩展性的高并发业务处理系统。本文论述的用电信息采集系统规约服务模型将采用基于C/M/S 三层架构的Ice 中间件。C/M/S 三层架构结构如图1.1 所示:
1 Ice 主要技术研究
1.1 Slice 语言
Ice 规范语言(Specification Language for Ice),Slice 在客户和服务器之间建立合约, 通过用Slice 定义数据类型和接口, 创建出与语言无关的API 定义,编译器可以把这样的定义翻译成针对C++ 或Java 的API。Slice 提供了常用的内建类型,并允许你创建用户定义的、具有任意复杂度的类型,比如序列、枚举、结构、词典,以及类。
Slice 还可用于描述持续的Ice 对象状态,从而实现自动存储对象状态服务器的快速开发。借助其可扩展的元数据设施,可为特定目的的应用标记Slice 映射, 满足特定应用的需求。
Ice 目前定义了C++ 和Java 的语言映射。如果客户机和服务器是用不同语言开发的,那么他们不能共享任何源文件和二进制组件。若客户端用Java 语言编写, 服务器端用C++ 语言编写,那么客户端和服务器端开发者是完全独立的,分别使用自己的开发环境和语言映射,他们之间唯一的链接就是他们各自使用的Slice 映射。采用Slice 多语言映射进行跨平台开发流程如图1.2 所示:
1.2 Ice 对象
Ice 对象是一种抽象的实体,其特征为:
(1)Ice 对象是部署在本地或远地的、能够响应客户请求的实体。
(2)一个Ice 对象可在一个或多个服务器中实例化。
(3)每个Ice 对象都有一个或多个接口。一个接口是一个对象所支持的一系列有名称的操作,客户通过调用操作来发出请求。一个Ice 对象具有一个主接口和零到多个其他接口。
(4)每个Ice 对象都有一个唯一的对象标识。对象标识是用于把一个对象与其他所有对象区别开来的标识值。
1.3 Ice 协议
Ice 提供了一种RPC 协议,既可以把TCP/IP、也可以把UDP 用作底层传输机制。此外, Ice 还允许你把SSL 用作传输机制,让客户与服务器间的所有通信都进行加密。Ice 协议定义了:
(1)一些消息类型,比如请求和答复类型。
(2)协议状态机,确定客户与服务器以怎样的序列交换不同的消息类型,同时还包括相关的TCP/IP 连接建立和关闭语义。
(3)编码规则,确定在线路上怎样表示数据的类型。
(4)每种消息类型的头,包括消息类型、消息尺寸、所使用的协议及编码版本。
Ice 协议适用于构建高效的事件转发机制,并且交换过程中不需要对消息进行任何解编或重整编,它们可以简单地把消息当作不透明的字节缓冲区加以转发。
Ice 协议还适用于构建双向操作,如果服务器想要把一条消息发送给客户提供的某个回调对象,这个回调对象可以通过客户原来创建的连接传给服务器。如果
图1.1 C/M/S 三层架构结构图
图1.2 Slice 多语言映射进行跨平台开发流程图029
实验研究
Experimental Research
电子制作
客户在防火墙后面,连接只能外出,不能进入,这种特性就特别重要。
Ice 在架构上为应用提供了异步的操作调用和分派,并且屏蔽了客户及服务器底层的机器架构,从而实现了规约服务的跨平台调用。
1.4 远程调用逻辑结构
基于Ice 的分布式程序设计,其客户端与服务器端内部的逻辑结构如图1.3 所示:
基于Ice 构建的分布式程序基础框架主要由Ice 库代码、Slice 代理代码及应用代码三大部分组成。
Ice 核心库为构建分布式系统提供强有力的通信支持,其封装了网络通信、线程管理、锁、异常处理等内容,使得具体应用系统的业务逻辑处理与网络通信安全隔离,为构建轻量级的分布式程序提供可能。
代理代码即Ice 通过用户定义的Slice 接口所生成的代码,其为应用系统提供接口调用,并对接口所涉及的整编和解编代码部分进行封装。
应用代码为具体业务应用相关的代码,即与Ice 本身无关的部分。
2 规约服务
2.1 体系结构
规约服务将与具体子系统高度耦合的规约处理逻辑进行封装,从而实现规约服务对前置不同子系统的兼容。规约服务完全从具体子系统的应用需求出发进行定制,具备动态扩展能力,通过对外提供统一的规约处理接口,并发处理来自前置其它子系统的规约服务请求。
一套业务系统可能需要兼容多套规约,每套规约可能完全不同,也可能大同小异。基于松耦合、易扩展的设计原则,规约服务在设计上引用规约插件理念,根据业务需要分为规约请求处理器、规约插件管理器及具体的规约插件三大部分。通过Ice 提供的通信处理接口,采用消息通知机制并发式处理来自远端的规约服务事件。
规约服务体系结构如图2.1 所示:
为了解决各个前置机子系统对规约处理的差异化请求,采用面向对象的观点,将每个前置子系统所使用的设备规约及调用接口抽象出来,构建成独立于具体子系统的规约处理对象(即规约插件),规约插件根据业务需要又细分成应用接口层、数据表示层及设备规约层等逻辑结构。负责规约预处理、应用接口处理、中间数据转换、设备规约解析封装等。规约服务封装了与具体前置子系统相关联的数据交互语言(如XML、消息流、对象等),用于设备规约与子系统应用的数据交互。
2.2 业务规约插件化
将业务规约插件化,首先要对具体业务系统所用的规约进行对象化,一套业务系统可能需要兼容多套规约,每套规约可能完全不同,也可能大同小异,或根据业务需要用户还可能会对某些规约项进行修改。因此,对规约进行插件化需要对规约对象进行抽象、聚合、提取、继承人等过程。出于松耦合、易扩展的设计原则,规约插件设计上分成规约插件管理器及具体的规约插件两个逻辑部分。可以方便规
图1.3 Ice 客户与服务器的结构
图2.1 规约服务体系结构图030
实验研究
Experimental Research
电子制作
约服务与用电信息采集前置系统的接口及其相应规约库的升级,又可以任意扩展系统规约,满足业务系统多种通信设备接入。
规约插件适配器用于对外提供统一接口,并负责对各个规约插件进行管理。规约插件负责业务系统与具体通信设备的协议转换。
为了方便规约插件的管理,实现前置机系统对各业务系统、各现场设备的支持,需要对各种规约插件进行调度管理, 并对各个插件的调用接口进行统一,因此需要设计一个规约插件管理器。规约插件管理器内部层次化处理,包括:规约预处理、规约调度、接口管理及规约装载等。
规约插件工作时,规约插件管理器会根据传入的规约号或特定规约标识自动调用相关规约。前置机系统不需要关心具体规约的名称、规约的存放位置等信息。
规约插件根据业务需要又细分成应用接口层、数据表示层及设备规约层等逻辑结构。负责规约预处理、应用接口处理、中间数据转换、设备规约解析封装等。
规约插件封装了与具体业务系统相关联的数据交互语言(如XML/JSON 等), 用于设备规约与业务应用的数据交互。
将与具体业务系统高度耦合的业务处理逻辑封装到具体的规约插件内部(如用电信息采集系统的报文分帧、组帧及加密接口调度等),从而实现规约服务对用电信息采集不同子系统的兼容。
规约插件完全从具体业务系统的应用需求出发进行定制,使用统一规范的调用接口,接入规约插件适配器,即可在规约服务中运行。
(1)使用统一的插件适配器接口,可将尽可能多的规约接入其中,提高了规约服务对不同业务子系统的支持性和扩展性。
(2)通过开发不同规约插件取代了前置服务与具体业务主站的交互接口,从而为构建轻量级采集前置系统提供支持。
(3)采用规约插件化技术,将各业务系统使用的数据交换格式(如XML/JOSN/ HEX)及其差异性封装至规约插件中,从而实现前置服务对不同业务系统的兼容。
(4)规约插件技术抽象化了每一种设备通讯规约的实现,使得前置系统与具体的通讯设备规约完全脱离,从而为构建一套独立于业务系统的通用前置机提供可能。
2.3 规约服务设计
Prosvr :规约服务核心类,继承统一的prorpc 接口(Slice 语言映射后的RPC 接口),接收来自客户端的请求,处理规约解析及应答,具备线程安全级并发处理及负载均衡能力。关联规约插件管理器、可复用对象池及规约服务运行管理等。
protocolService :继承自Ice::Service, 并重新定义Start 成员函数,规约服务在Start 函数里执行,处理命令行参数、创建对象适配器并注册servants。
Reusable_ObjectPool :可复用对象池, 通过管理和复用有限的对象资源,减少对象重复创建和销毁时的系统开销。在需要对象时,将其从对象池中取出,任务完成后再将其置入池中。可复用对象池可以装载通信连接、规约处理对象或内存等任意类型对象,并可根据需要进行自适应增长。
规约服务类结构如图2.2 所示:
2.4 服务集群设计
部署规约服务极其简单,可以单机运行,也可用集群方式部署。在服务端和客户端均需要配置规约服务所绑定的通信端点及协议。规约服务集群部署如图2.3 所示:
图2.2 规约服务类结构图031
实验研究
Experimental Research
电子制作
Ice 内置多种负载均衡算法,本设计采用round-robin 负载均衡方案,通过集群方式将Client 的每个请求合理的分配到每个Server。从而有效地避免了Client 大量请求对某一台Server 的巨大压力。
规约服务具备强大容错支持,规约请求端绑定多个规约服务后,规约请求端就具备对多个规约服务的状态感知能力,能够实时监测规约服务的健康状况和压力情况。这些均由Ice 属性配置决定,对于开发者都是透明的。
3 结论
基于Ice 的用电信息采集规约服务, 可在不影响业务系统运行的情况下,根据业务需要及性能要求动态扩展规约服务实例,借助Ice 提供的负载均衡解决方案, 保证了系统的可靠性与灵活性。
规约服务的使用大大提升用电信息采集前置机系统的稳定性与扩展性,其优势体现在如下几个方面:
(1)简化前置机其它子系统规约业务处理,增强前置机系统健壮性。
(2)使用统一的插件适配器接口,可将尽可能多的规约接入其中,提高了规约服务的支持性和扩展性。
(3)采用规约插件化技术,将各前置子系统使用的数据交换格式(XML、消息流、对象等)及其差异性封装至规约插件中,为不同的前置子系统提供统一多样化的规约服务。
(4)规约服务抽象化了前置子系统的规约处理需求,使得前置子系统与具体的通讯设备规约处理完全脱离,从而为构建轻量级前置子系统提供条件。
【参考文献】
[1] 反叛之冰:Internet Communications Engine. 马维达译
[2] 分布式程序设计 马维达, 译