《电子技术应用》

Tcn中间件系统的设计与实现

2017年微型机与应用第5期 作者:霍长娟1,孙洪平2
2017/4/5 21:40:00

  霍长娟1,孙洪平2

  (1. 中国航空结算有限责任公司,北京 100028;2. 北京高阳金信信息技术有限公司,北京 100050)

       摘要:主要介绍了一款基于消息通信的中间件软件——The Cocklebur Network,即Tcn中间件的设计与实现。该系统具有以下特点:多进程模型、预先创建子进程机制,提高系统响应速度;编程API简单易用,都是围绕Tcn软件中专有的协议——Tcn协议展开,可运用标准的C语言库函数与头文件进行各种应用服务的开发;Tcn设计并实现了通过动态库与静态链接两种方式加载用户服务;同时此款软件还支持文件传输、负载均衡等功能。经过LoadRunner测试,该软件有较好的性能,可以满足大多数企业需要。

  关键词:Tcn;多进程模型;Tcn协议;LoadRunner

  中图分类号:TP311文献标识码:ADOI: 10.19358/j.issn.1674-7720.2017.05.005

  引用格式:霍长娟,孙洪平.Tcn中间件系统的设计与实现[J].微型机与应用,2017,36(5):14-17,20.

0引言

  中间件是分布式系统中的一层支撑软件,它位于操作系统和应用程序之间,负责对应用程序及开发人员屏蔽系统中硬件、网络、操作系统和编程语言等方面的异构性并向他们提供统一的运行平台和友好的开发环境。目前主流的中间件有Weblogic、Tuxedo、Websphere等,这些中间件都拥有各自的应用领域。本文主要介绍一款基于消息通信的中间件软件(The Cocklebur Network,Tcn),即Tcn中间件的设计与实现,在保持屏蔽各种异构性功能的基础上,它的设计与实现又有自身的特点,由于Tcn涉及的模块较多,本文将从多进程模型[12]、用户服务加载两方面内容进行重点介绍,最后给出测试结论。

1系统架构

  Tcn中间件属于消息通信中间件,完全结合实践设计,扩展性好,易于使用。下面以银行取款案例说明Tcn的架构设计,如图1所示,客户在柜台客户端(这里称为Tcn Client)发起取款请求,Tcn Client通过Tcn协议[3] 与服务器(这里称为Tcn Server)进行通信,在Tcn Server中,管理进程Tcnd负责管理整个Tcn Server,是整个系统的中枢,工作进程Tcnw负责响应客户端的请求,并根据配置文件等信息调用与之对应的取款服务(这里称为Service),这就是取款业务在Tcn中间件中的工作流程,另外,Tcn Client端的取款请求以及供Tcnw调用的取款Sevice都是基于Tcn编程接口进行开发的。

001.jpg

2软件说明

  Tcn软件主要由运行系统与开发系统组成。运行系统作为整个系统的中枢,控制着所有资源的申请、回收、释放,调度系统中的全部应用服务。开发系统提供C语言的库函数与头文件,供用户开发应用程序。

  2.1产品目录结构

  Tcn软件假定安装在AIX环境中/home/tcn目录下,产品的目录结构如下:

  /home/tcn/bin//执行文件存放位置

  /home/tcn/inc//开发环境头文件

  /home/tcn/lib//开发环境函数库

  /home/tcn/cfg//配置文件与重建Tcn模版存放位置

  /home/tcn/cfg/app.conf//配置文件模版

  /home/tcn/cfg/tcn.mk//重建Tcn的脚本模版

  /home/tcn/sample//用户服务例子

  2.2运行系统组成

  运行系统由5部分组成:核心进程、管理工具、配置文件、日志文件、环境变量。

  (1)核心进程:整个系统的运行关键部分。

  tcnd:负责对整个系统进行监控管理的守护进程。

  tcnw:负责接受客户端访问、调用服务、返回处理结果的进程。

  tcnlogd:负责登记系统日志。

  (2)管理工具

  tcnx:用于启动、关闭、重启Tcn系统,检查运行状态,检查配置文件语法。

  tcnr:热重启脚本,先检查配置文件语法,然后发送重启信号。

  tcns:检查Tcn系统是否为运行的脚本。

  tcnping:用于测试服务器节点是否可以连通。

  tcnas:用于监控服务器运行状态等信息。

  (3)配置文件:整个tcn系统运行的依据。

  (4)日志文件:记录系统运行时的错误、警告、提示等信息。

  (5)环境变量:Tcn的运行需要设置2个环境变量TCN_CONFIG、PATH。

  TCN_CONFIG:设置Tcn系统的配置文件路径。

  PATH:将Tcn可执行文件目录加入到PATH环境变量中,以便Tcn的管理工具可以通过PATH查找到。

  2.3开发系统组成

  Tcn开发系统由编程头文件与函数库组成。

  (1)头文件

  tpdi.h:用户编程API的头文件。

  tpft.h:用于传输文件的编程头文件。

  (2)函数库

  libtpdi.a:用户编程API的函数库。

3多进程模型

  3.1多进程模型机制

  整个Tcn Server通过多进程模型机制对外提供服务,设计多进程模型的目的是为了提高响应速度和系统整体运行效率并达到无缝重启。所谓多进程模型就是系统中存在两种进程,如图2所示。一种是对外提供服务的进程worker process,此类进程用于响应客户端请求并调用相应的服务;另一种进程就是预先创建的子进程(这里称之为prefork worker process),时刻处于ready状态,准备成为worker process。为什么多进程模型机制能提高系统的响应速度?在传统中间件系统中,当服务连接请求到达之后,fork函数会为服务连接请求创建子进程,并分配相应资源,进而对外提供服务,而在Tcn系统中,系统启动之初,管理进程Tcnd就根据配置文件的参数设置预先创建N个子进程(prefork worker process)等待用户服务请求,这些子进程一直处于ready状态,当用户服务请求到达之后,直接对外提供服务,而不需要fork函数再创建子进程,所以很显然能提高工作效率。

 

002.jpg

  3.2创建、回收进程

  如何保证预先创建的子进程个数既能满足对外提供服务又不会造成资源浪费?如图2所示,在多进程模型中,完成这种预先创建的机制主要涉及3个活动:fork创建子进程、reclaim回收进程、布告板(bulletin board)信息的维护。也就是说,无论创建还是回收子进程都是以布告板信息为依据的,因为布告板中记录着系统当前的worker process的个数,目前处于busy、ready还是idle状态等信息,管理进程Tcnd就是根据这些信息进行动态创建回收子进程,进而保证资源平衡。

  3.3配置文件中的指令

  配置文件是Tcn系统启动、重启的依据,通过修改配置文件,对Tcn系统进行功能裁剪。配置文件提供多达40条指令,这些指令控制着资源的申请、进程数量、监听端口、负载均衡、增加主机访问控制、导出用户服务等。在多进程模型中,有两个指令发挥重要作用:

  (1)MinfreeDaemons:最小空闲子进程数量,默认值为5。

  (2)MaxfreeDaemons:最大空闲子进程数量,默认值为10。

  Tcn启动之初,管理进程会根据配置文件预先创建N个子进程,即N个prefork worker process,N设置为大于1的整数,后续的创建与回收主要以当前负载为基准,管理进程时刻关注着布告板(bulletin board)中的worker进程信息,查看当前的负载情况,同时根据MinfreeDaemons和MaxfreeDaemons的值来维护prefork worker process的个数进行资源的平衡。

4用户服务加载

  用户服务加载主要是指Tcn系统如何通过接口与用户服务程序进行连接。Tcn设计并实现出通过动态库[4] 与静态链接两种方式加载用户服务程序的方法,相比其他中间件,大大提高了软件的灵活性,方便开发人员使用。

  4.1静态链接

  像大多数中间件一样,Tcn提供静态链接的方式加载用户服务程序。所谓静态链接,在Tcn中就是指用户服务程序不被编译成动态库文件,而是通过服务程序源文件重建成Tcn的工作进程——Tcnw来实现,当客户端发起服务请求时,管理进程Tcnd直接分配Tcnw进程,调用相应服务,响应请求。目前大多数中间件都是这种加载方式。静态链接的方式最大的缺点就是在更新服务时必须停止系统。

  4.2动态库

  Tcn除提供静态链接外,还提供另外一种方式加载用户服务,即动态库加载。所谓动态库加载就是用户服务程序被编译成动态库文件,同时用户服务程序与动态库文件的关系(即哪些用户服务程序被编译成哪个动态库文件)记录到配置文件中,Tcn启动时,根据配置文件加载动态库到系统中,同时建立一个哈希列表,记录用户服务程序与动态库文件之间的关系。如图3所示,当客户端服务请求到达之后,会话句柄分析服务请求(request)是否符合Tcn协议以及语法语义要求,如果符合,进一步分析出需要调用的服务名,然后去哈希表中寻找该服务入口,根据指针指向调用相应的服务,完成此次请求。

003.jpg

  通过动态库加载用户服务程序可以实现在不停止系统运行的情况下通过热启动的方式来变更服务。例如,当出现取款服务需要紧急变更而系统中的取款服务又没有运行(run)完时,就需要动态库加载。Tcn是这样解决的,保持系统中的取款服务继续运行,修改取款服务程序源文件(由于取款服务源文件之前已经被编译成动态库文件,目前系统中取款服务是通过调用动态库加载的,与取款服务源程序文件已经没有关系,因此这时可以修改取款服务源文件),修改完源文件后,再编译成动态库文件,进而把原动态库文件替换掉即可,最后通过热启动Tcn,就可以根据配置文件重新加载新的服务。在整个过程中,系统中旧有的取款服务一直处于running状态,直到结束,这就是通过加载动态库方式,不需要重启机器就可以变更服务的过程。

  动态库加载服务的方式大大提高了软件的灵活性,尤其在要求不能宕机的实际生产业务中,将体现出其重要作用。

5测试结果

  为了证明Tcn产品的性能及稳定性,确保其高吞吐率及在高并发环境中的持续稳定运行,针对Tcn系统进行了压力测试。本次测试的范围,选取foo服务进行测试(服务foo就是接收来自客户端发送的字符串,然后应答相同的字符串)。在性能测试过程中,测试Tcn系统的并发能力和平均响应时间。在负载均衡测试过程中模拟关闭一个负载节点,能否自动将请求转发至其他的节点。

004.jpg

  以性能测试为例,经过10 h的测试,成功率为100%,如表1所示。通过分析测试结果,平均响应时间都在毫秒级,从资源监控的结果图(图4~图9)中可以看出,CPU、内存、磁盘I/O均消耗很少,网络I/O相对较为繁忙。因此在较高的TPS情况下,Tcn服务器自身消耗较少的系统资源。

  

005.jpg

  在测试结果中,短链接的TPS远远低于长链接的TPS,短链接的平均响应时间也高于长链接。长链接能大幅提升系统整体性能,但是长链接在长时间的空闲后,网络链接依然存在,无法收发报文,通常的解决办法是定时发送探测报文;另外长链接也不利于实现负载均衡。所以Tcn服务器实现一定请求次数的长链接后就会断开链接,这样既能保留长链接的优点,也利于实现负载均衡。在负载均衡测试中,模拟关闭一个负载节点,在负载节点切换过程中,并未对代理服务器的资源占用造成较大幅度变动。以下给出短链接的测试结果:

  VUs: LoadRunner中的虚拟用户数,模拟客户端的数量。

6结论

  本文概要介绍了Tcn软件的概念及基本功能,结合其特点,重点描述了多进程模型机制的原理、实现,用户加载服务的两种方法。最后给出了利用LoadRunner进行性能及压力测试的测试报告,证明Tcn系统在高并发环境中能保持高吞吐率并且持续稳定运行。

  参考文献

  [1] STEVENS W R.UNIX 网络编程[M].杨继张,译. 北京:人民邮电出版社,2009.

  [2] STEVENS W R.TCP/IP详解[M].范建华,译.北京:机械工业出版社,2000.

  [3] SURHONE L M, TENNOE M T, HENSSONOW S F. External data representation[M].Betascript Publishing,2010.


继续阅读>>