APP下载

基于ZeroMQ的SOA分布式通信系统设计∗

2018-07-10李冬琦

计算机与数字工程 2018年6期
关键词:服务端通讯代理

李冬琦 高 键

1 引言

通过对各大型网站的架构演变过程进行分析,会发现他们具有一个显著的共同点是在某个阶段网站的架构体系改造为服务化的体系,也就是常说的SOA(Service Oriented Architecture),中文译为面向服务的体系结构[1]。

在SOA系统中,资源被作为可通过标准方式访问的独立服务提供给网络中的其他成员[2]。各个节点之间的通讯需遵守统一的交互标准。与传统的系统结构相比,SOA规定了资源间更为灵活的松散耦合关系[3]。基于服务化的主要目的是为了解决网站多元化,开发人员增加及访问量增加带来的水平伸缩问题[4]。

目前,SOA分布式系统实现方式主要有以下三种:基于socket API、基于消息中间件、基于网络库[5]。第一种方式很少使用,本文不做讨论,着重研究后面两种SOA系统。

2 SOA分布式通信框架演变

随着计算机的飞速发展,变化莫测的商业环境带来了各种各样、层出不穷的业务需求,原本单一的应用架构越来越难以满足复杂的业务需求。因此,系统拆分已成为大势所趋。由此演变为垂直应用架构体系[6]。

垂直应用架构缓解了单一应用架构所面对的动态扩展问题,系统面临的总体压力被均分到各个子系统,且系统的总体规模可控,在一定程度上,降低了开发人员之间的协作的成本,提高了团队的整体开发效率[7]。

然而,当垂直应用程序的规模逐步增加,达到了一定数量时,应用之间的互相通信,互相调用便成为了亟待解决的问题[8]。否则,各个子系统的重叠业务需要重复实现,也就是所谓的信息孤岛[9]。此时,核心业务被提取,作为一个单独的子系统向外界提供服务,实现业务之间的相互重用[10],系统已演变成分布式应用程序架构,如图1所示。

图1 分布式架构演变

分布式应用程序架构对业务逻辑重用的需求非常大,上层业务都想借用现有的底层服务,快速的开发出功能复杂,内容丰富的新应用,减少人力和时间成本,迅速满足不断变化的市场需求[11]。公共的服务被分离出来,成为系统中的共享服务,尽可能的复用已有的代码和业务逻辑,避免重复工作,也就是前文中提到的SOA。

SOA体系结构中,服务消费者通过名称,在服务路由中找到要调用服务的地址列表[12],服务路由如图2所示。

图2 服务路由示意图

3 ZeroMQ介绍

3.1 ZeroMQ概述

ZeroMQ(以下简称ZMQ)[13]是TCP/IP参考模型中新的一层,介于应用层和传输层之间[14],如图3所示。它和Socket的最大不同在于:普通的Socket是点对点的通讯,是1:1的关系。而ZMQ却是节点与节点之间的通讯,是N:M的关系[15]。Socket套接字的使用者需要显示的创建连接、销毁连接、处理异常、选择网络协议。而ZMQ屏蔽了这些细节,让网络编程变得更加简单,高效[16]。

图3 ZMQ所处层次

3.2 ZeroMQ消息模式

ZMQ提供了4种基础消息通讯模式,分别是独立对模式(Exclusive-Pair)、请求应答模式(Request-Reply)、发布订阅模式(Publish-Subscribe)和推拉模式(Push-Pull)。使用者可以根据具体应用场景,组合其中的2种或更多的模式,构建自己的通讯架构解决方案。

3.2.1 独立对模式

它是最简单的一对一连接消息通讯模式,主要是为了兼容TCP原生Socket通讯模型。也常被用于进程内部的线程间通信。虽然数据可以双向流动,但是一个服务端只能接受一个连接,这一点和后面的请求应答模式有很大不同。

3.2.2 请求应答模式

由客户端(REQ模式)发起请求,然后等待服务端(REP模式)回复应答。发出一个请求必须对应收到一个应答,站在客户端的角度看,是发-收同步。站在服务端的角度看,是收-发同步。此模式与独立对模式相比,最大的区别在于,一个服务端可以接受1至N个客户端连接。该模式主要用于远程过程调用,既客户端远程调用服务端的方法。典型的应用场景就是Echo服务器,如图4所示。

图4 Echo服务器示意图

3.2.3 发布订阅模型

发布方(PUB模式)以单向方式分发数据,并且不关心是否将所有信息发送到订阅方(SUB模式),系统模型如图5所示。如果发布方开始发布信息,而此时订阅方尚未连接,则将直接丢弃该信息。订阅方的信息丢失问题可以通过和请求应答模式组合来弥补。订阅方只负责接收,且不能应答。该模式主要用于数据分发。天气预报,微博关注可以使用这种经典模式。

图5 发布订阅模型

3.2.4 推拉模型

客户端(PUSH模式)作为生产者和服务端(PULL模式)作为消费者,系统模型如图6所示。客户端在内部进行负载均衡,使用平均分配算法,把所有消息均衡推送到服务端。与发布订阅模式相比,消息在没有被消费情况下,不会被丢弃,而是堆积在客户端。在消费能力低于生产能力的情况下,可采用增加消费者并行消费的解决方案。该模式的主要应用场景是多任务并行的负载均衡方案。

图6 推拉模型

4 基于ZeroMQ设计SOA系统

4.1 总体架构设计

本文设计的SOA分布式系统框架如图7所示,该系统由一个代理,多个客户端和多个工人组成,属于N:M的通讯。工人在代理中注册自己的服务名和地址。客户端发送请求给服务时,先发送请求信息到代理,代理根据服务名把请求信息转发给对应的工人,工人完成请求之后,回复应答信息到代理,再由代理转发给对应的客户端。

图7 总体架构示意图

4.2 协议设计

SOA系统中的各个节点正常通讯的前提是节点之间的通信准守统一的标准。为此,本文设计了一个简单的通信协议Majordomo Protocol(以下简称MDP)。该协议定义了SOA系统中的成员组成、数据交换格式、心跳和请求/应答处理过程。协议分为客户端协议和工人协议两部分,客户端协议规定了代理和客户端之间数据封装格式;工人协议规定了代理和工人之间的数据封装格式。

4.2.1 客户端协议MDP/Client

请求/应答:客户端的请求/应答数据包由4帧数据组成,数据封装格式如下:

Frame 0:空(0个字节)

Frame 1:“MDPC01”(MDP/Client v0.1)

Frame 2:Service name(服务节点注册名)

Frame 3:Message body(消息体)

4.2.2 工人协议MDP/Worker

准备命令:工人的准备命令数据包由4帧数据组成,数据封装格式如下:

Frame 0:Empty

Frame 1:“MDPW01”(MDP/Worker v0.1)Frame 2:0x01(代表准备)

Frame 3:Service name(注册的服务名)

请求应答命令:工人的请求应答命令是由6帧数据组成,数据封装格式如下:

Frame 0:Empty

Frame 1:“MDPW01”(MDP/Worker v0.1)

Frame 2:0x02/0x03(0x02请求;0x03应答)

Frame 3:Client address(客户端身份)

Frame 4:Empty

Frame 5:Message body(消息体)

心跳命令:心跳命令是由3帧数据组成,数据封装格式如下:

Frame 0:Empty

Frame 1:“MDPW01”(MDP/Worker v0.1)

Frame 2:0x04(代表心跳)

4.3 功能实现

4.3.1 客户端设计

客户端在系统中扮演服务消费者的角色,是命令的发起者,工作流程如图8所示。

客户端采用了同步的请求-应答模式,使用REQ套接字,该套接字发送数据包时,会在数据包的头部自动添加一帧空数据。在收到数据时,自动去掉第一帧空数据头之后返回给应用程序。REQ套接字必须发-收同步,否则会产生异常。

图8 客户端流程图

客户端应该在没有收到任何回复的情况下要做出合理的恢复策略。本文所采用的策略如下:

1)使用轮询请求套接字的方式替换阻塞请求套接字。

2)如果在超时时间内没有收到应答,关闭请求套接字重新建立一个新的请求套接字连接,再次发送请求。

3)如果在重试几次之后依然没有回复,通知应用进程应答接收超时。客户端主要接口定义如下:

session=mdcli_new(“tcp://localhost:5555”);

void mdcli_destroy(&session);

zmsg_t*mdcli_send(self,service,request)

4.3.2 工人设计

工人在系统中扮演提供服务者的角色,是命令的接收者,工作流程如图9所示。

图9 工人流程图

工人是一个同步和异步混合的套接字,所以使用DEALER(XREQ),工人在接收到客户端请求的时候,使用同步方式,接收和发送心跳的时候使用异步方式。工人主要接口定义如下:

mdwrk_t*mdwrk_new(broker,service);

void mdwrk_destroy(&self_p);

zmsg_t*mdwrk_recv(self,reply)。

4.3.3 代理

代理是系统的服务总线,维护了服务名和工人地址之间的映射关系,代理的工作流程如图10所示。

图10 代理流程图

代理使用ROUTER套接字,同时与客户端和工人建立连接。代理首先把工人注册的服务名和工人地址建立映射关系。为每一个服务维护一个共享队列,队列有多个写入者(客户端)和多个读出者(工人)。客户端发送的请求在代理中进行公平排队。然后转发给提供对应服务的工人。代理的主要接口定义如下:

broker_t*self=s_broker_new(verbose);

zmsg_t*msg=zmsg_recv(self->socket);

s_broker_client_msg(self,sender,msg);

s_broker_worker_msg(self,sender,msg)。

5 实验结果与分析

实验目的:对比ZeroMQ实现的SOA通讯系统和MSMMQ、ActiveMQ、RabbitMQ的通信效率。

实验环境:三台计算机组成局域网,分别运行客户端、工人和代理。每台计算机的性能参数如表1所示。

表1 计算机性能参数

实验方法:客户端循环给工人发送10000个数据包,每个数据包的大小是1KB。客户端记录从开始发送到结束发送的时间。

实验结果:实验结果如表2所示。

结果分析:在被测试的四种消息中间件中,ZMQ的速度比其他三种消息中间件至少快4倍以上。但是和ZMQ官方数据相差甚远,其主要原因在于,所有的通讯是在SOA通讯框架下进行的,而官方的数据是在ZMQ的基本通讯模式中测试的。

表2 SOA系统性能测试结果

ZMQ的实质是开源库,可以被多种编译器,多种编译语言编译。因此支持的系统较为广泛,甚至支持一些嵌入式系统。

6 结语

基于ZMQ构建的SOA分布式系统,比目前其他主流的消息中间件构建的SOA通讯系统的速度有所提高,而且移植性能较好。但是ZMQ还不够成熟,稳定性不尽人意。

[1]程小雷,张丹峰.基于面向服务架构的保险代理信息管理系统的应用[J].应用力学与材料,2014,3009(519):1554-1557.

CHENGXiaolei,ZHANGDanfeng.Application of Information Management System for Insurance Agents Based on Service Oriented Architecture[J].Applied Mechanics and Materials,2014,3009(519):1554-1557.

[2]关宁,赵杨,王俊霖.基于 SOA的报表设计[J].计算机系统应用,2014,37(2):106-107.

GUAN Ning,ZHAO Yang,WANG Junlin.Report Design Based on SOA[J].Computer Systems&Applications,2014,37(2):106-107.

[3]曲婉嘉,刘颖,徐忠林.基于SOA的军事目标“选打一体化”信息系统研究[J].电子设计工程,2016,24(23):10-14.

QU Wanjia,LIU Ying,XU Zhonglin.Research on Information System of Military Project Based on SOA[J].International Electronic Elements,2016,24(23):10-14.

[4]潜昕,罗沙白,卢康权.构建基于分布式SOA架构的统一身份认证体系[J].软件,2013,34(1):17-19.

QIAN Xin,LUO Shabai,LU Kangquan.Construct a Unified Identity Authentication System Based on Distributed SOA Architecture[J].Computer Engineering&Software,2013,34(1):17-19.

[5]李攀.基于SOA架构和构件技术的软件开发[J].电子技术与软件工程,2016(21):61.

LI Pan.Software Development Based on SOA Architecture and Component Technology[J].Electronic Technology&Software Engineering ,2016(21):61.

[6]蒲凤平.基于中间件技术的分布式监测系统研究[D].成都:西南交通大学,2012:10-13.

PU Fengping.Research on Distributed Monitoring System Based on Middleware Technology[D].Chengdu:Southwest Jiaotong University,2012:10-13.

[7]陈康贤.大型分布式网站设计与实现[M].北京:电子工业出版社,2014:30-32.

CHENKangxian.Design and Implementation of Large Distributed Websites[M].Beijing:Electronic Industry Press,2014:30-32.

[8]叶崧,姚健东.基于ZeroMQ&JSON的分布式测控系统消息通信架构设计[J].现代电子技术,2014,37(2):106-107.

YE Song,YAO Jiandong.Design of Message Communication Architecture for Distributed Measurement and Control System Based on ZeroMQ&JSON[J].Modern Electronics Technique,2014,37(2):106-107.

[9]刘号,张新晨,李中年.基于LCM与ZeroMQ的进程间通信研究[J].电子科学技术,2016,3(4):480-483.

LIU Hao,ZHANG Xinchen,LI Zhongnian.Research on Inter-process Communication Based on LCM and ZeroMQ[J].Electronic Science&Technology,2016,3(4):480-483.

[10]贾阿丽.基于分布式系统的PPP的设计与实现[D].重庆:重庆大学,2014:25-27.

JIA Alin.Design and Implementation of PPP Based on Distributed System[D].Chongqing:Chongqing University,2014:25-27.

[11]湛文韬,解文涛,孙靖国,等.实时分布式系统性能测试技术研究[J].计算机技术与发展,2014,24(7):226-229.

ZHAN Wentao,XIE Wentao,SUN Jingguo,et al.Research on Real-time Distributed System Performance Testing Technology[J].Computer Technology&Development,2014,24(7):226-229.

[12]田永红,王艳芳,包力.基于SOA的Web服务组合建模研究[J].内蒙古工业大学学报(自然科学版),2016,35(4):288-292.

TIAN Yonghong,WANG Yanfang,BAO Li.Research on Web Service Portfolio Modeling Based on SOA[J].Journal of Inner Mongolia University of Technology(Natural Science),2016,35(4):288-292.

[13]蒲凤平,陈建政.基于ZeroMQ的分布式系统[J].电子测试,2012,31(7):24-29.

PU Fengping,CHEN Jianzheng.Distributed System Based on ZeroMQ[J].Electronic Test,2012,31(7):24-29.

[14]张蓓蓓,张松,李京.基于ZeroMQ的电子侦察系统数据通信平台的设计与实现[J].小型微型计算机系统,2016,37(3):521-525.

ZHANG Beibei,ZHANG Song,LI Jing.Design and Implementation of Data Communication Platform for Electronic Reconnaissance System Based on ZeroMQ[J].Journal of Chinese Mini-Micro Computer Systems,2016,37(3):521-525.

[15]皮特亨特金斯.ZeroMQ消息机制的应用[M].美国:奥莱利媒体,2013:49-52.Pieter Hintjens.ZeroMQ-Messaging for Many Applications[M].United States of America:O'Reilly Media,2013:49-52.

[16]薛鹏飞,胡荣贵,胡劲松.基于ZeroMQ的分布式系统通信方法[J].计算机应用,2015,35(S2):34-37.

XUE Pengfeng,HU Ronggui,HU Jinsong.Distributed System Communication Method Based on ZeroMQ[J].Journal of Computer Applications,2015,35(S2):34-37.

猜你喜欢

服务端通讯代理
《茶叶通讯》简介
《茶叶通讯》简介
通讯报道
代理圣诞老人
代理手金宝 生意特别好
云存储中基于相似性的客户-服务端双端数据去重方法
新时期《移动Web服务端开发》课程教学改革的研究
在Windows Server 2008上创建应用
通讯简史
复仇代理乌龟君