2024年2月1日发(作者:)
第6卷第3期 2017年5月 网络新媒体技术 VoM1.6 NO.3 av 2017 基于Thrift的服务端数据推送机制设计 杨 吻 汪正舟 吴 腾 (中国电子科技集团公司第二十八研究所南京210007) 摘要:随着计算机系统规模变得越来越大,分布式体系结构越来越受到业界的青睐。在分布式系统各业务单元之间的数据交 换中,服务端数据推送是一种更为高效的模式,能够提供更高的数据时效性,并减少系统的无效负载。主要介绍了以开源服 务化远程访问开发框架Thrift为基础,实现服务端数据推送的方法,扩展了Thrit的功能,使Thrfit能够为具有高数据发布时效 f性要求的应用场景提供更有效的支撑,经过实验达到效果。 关键词:服务化,远程访问,Thrift,数据推送 The Design of the Server Side Data Push Mechanism Based on Thrift YANG rang,WANG Zhengzhou,WU Teng Abstract:In distributed system,server—side data push is a more efficent mode for exchanging data between distributed units.It can provide higher data timeliness and reduce the system’S resource consumption.This paper mainly introduces the nmthod of implemen— ring server—side data push based on Thritf whitch is an open source RPC framework.This method expands the function of Thrift SO that the Thrit can provide more efffective support for scenarios with high data timeliness requirements. Keywords:Service,RPC,Thrift,Data Push 随着计算机系统规模变得越来越大,将所有业务单元集中部署在一个或若干个高性能主机上的体系结 构已经越来越不能满足当今计算机系统尤其是大型互联网系统的快速发展,分布式处理方式越来越受到业 界的青睐。在分布式架构的计算机系统中,各业务单元之间通过服务化的远程访问方式实现数据的交 换¨ 。在各业务单元之间的数据交换过程中主要采用“拉取”和“推送”两种模式。在“拉取”模式中,由客 户端主动向服务端请求需要的数据,而在“推送”模式中,则由服务端在数据产生后主动将数据发送到客户 端。同“拉取”模式相比,“推送”模式的实时性更强,并且可以避免客户端定时向服务端查询数据所导致的 带宽和服务端处理资源的浪费。 Thrit是一种高效的开源服务化远程访问开发框架,其具有多语言支持、高效、简单和易于扩展的特点被 f广泛应用于各种分布式计算机系统中,但当前Thrit中尚未提供对服务端数据推送机制的支持,为了提高服 f务端数据发布的时效性,在Thrit中增加服务端数据推送机制是非常必要的。f 本文主要介绍了以Thrit为基础对其进行优化以实现服务端数据推送的机制,f使Thrit能够对具有数据 f发布时效性要求的应用场景提供更有效的支撑。 1 Thrift简介 Thrit是一个跨语言的服务化远程访问开发框架,最初由Facebook于2007年开发,并于2008年进入A一f 本文于2016~11—19收到。
3期 杨吻等:基于Thrit的服务端数据推送机制设计 f43 pache开源项目 。Thrit因其具有跨语言、高效、f 简单以及易于扩展等特点被广泛应用于分布式处 理系统中。 Thrift通过一个中间语言IDL(Interactive Data Language缩写IDL)来定义远程访问的接口以及用 ~ 客户端 服务端 服务实现 FooService. Server 田吕 服务调用 FooService. Client 应用层 框架层 到的数据类型,然后通过Thrit提供的IfDL的语言 Foo.WriteO/ Read0 TProtocal Foo.Write0/ Read0 TProtocal 编译器生成不同语言的服务端和客户端框架代码层、框架层、协议层和传输层组成,其中传输层提供 使用不同的传输方式的数据传输机制;协议层提供 多种格式的编码范式;框架层是由开发者使用 Thrit的IfDL对服务及其相关数据结构进行定义, 通过Thrift提供的编译器自动生成的框架代码,向 逻辑。Thrift的架构如图1所示。 协] 义层 协议层 来实现远程访问过程 。Thrit的架构主要由应用 僖榆昆 fTTransport TYransport 传输层 底层I/O < lIfl > 底层I/O 图1 Thrit的架构 f应用开发者提供实现服务的客户端和服务端接口;应用层是开发者基于框架层提供的框架代码编写的应用 2服务端数据推送机制的设计 在许多场景下,客户端需要获取服务端生产的数据,但客户端 ’ 并不知道服务端何时完成数据的生 产,因此需要客户端通过定时方式周期性的向服务端询问是否完成了数据的生产。采用这种方法的主要问 题是,会产生大量的无效查询,进而为客户端、服务端以及通信网络带来无效的负载,同时还会导致客户端 必须加入定时查询逻辑,增加了客户端的复杂性。定时查询还会带来获取数据的时延,而要降低时延又会 增大系统中的无效负载,因此不适合对数据时效性要求高的场景 ’ 。 服务端数据推送则是应对时效性要求高的场景的一种高效的数据交换模式。使用数据推送,由客户端 首先创建到服务端的连接,并在后续过程中保持该连接,服务端则在数据产生后立即通过该连接将数据发 送到相应的客户端,进而提高了数据的时效性,并且避免为系统带来无效的负载 。 目前Thrit只支持“拉取”模式,所有的交互必须由客户端发起,如果要使用Thrfit进行服务端数据推送 f只能采用服务端向客户端再反向再创建一个连接的方式。这种方式存在以下缺陷: (1)客户端与服务端需要各自独立定义服务接口,这样将相关的逻辑分裂成了2部分,不利于维护。 (2)客户端与服务端相互独立的建立相互连接,进而会导致一个连接断开而另一个连接还存在的问题 出现,而要实现2条连接状态的同步逻辑比较复杂。 (3)需要建立2条TCP连接,导致浪费连接资源,而本来TCP连接是支持全双工;客户端也需要作为服 务端,增加了客户端代码的复杂性。 基于以上原因,首先对Thrit的IfDL进行扩展, 通过增加关键字支持对服务端推送数据的定义;其 次复用客户端向服务端建立的TCP连接,利用TCP 连接的全双工特性在该连接上同时进行客户端到服 务端的服务调用消息以及服务端到客户端的数据推 送消息的传输;再次在客户端中增加用于在收到推 送数据后进行处理的回调接口,并在服务端中增加 用于向客户推送数据和管理客户端连接状态的接口。 Thrift服务端数据推送机制如图2所示。首先由 图2 Thrift服务端数据推送机制
44 网络新媒体技术 2017正 客户端发起到服务端的TCP连接,在连接建立后,客户端主动向服务端发送服务连接请求,建立到指定服务 的连接。客户端向服务端的服务调用与服务端向客户端的数据推送是相互独立的,服务端向客户端进行的 数据推送操作不依赖与客户端对服务端进行服务调用。 3服务端数据推送机制的实现 基于上面对服务端数据推送机制的设计,增加服务端推送的服务化定义。基于当前Thrit的服务描述 f语言并在其中增加push关键字以对推送数据进行定义。推送的数据可以是通过Thrit服务描述语言定义的 f任意合法数据类型。 namespaee cpp service.demo namespace java service.demo service Hello{ string helloString(1:string para) i32 helloInt(1:i32 para) bool helloBoolean(1:bool para) push string pushString()//推送数据定义 push i32 pushInt() push bool pushBoolean() f void helloVoid() 同时修改服务描述语言编译器,在为开发者提供的接口中为数据推送功能生成相应的操作。首先在生 成的XXXClient的构造函数中增加用于设置处理推送的数据的回调函数的操作;其次在服务端新增数据推 送接口XXXPushIf和连接处理接口ConnectionIf。在ConnectionIf接口中提供处理连接打开和关闭的OnOpen 和OnC1ose操作,并将新增的连接上下文对象XXXContext作为参数,通过XXXContext可以获得相应的XXX— Pushlf接口实现数据推送操作。 //客户端接口 //服务端 Class He1loContext//服务调用上下文 Class HelloPushCallback:public HelloPushlf//推送数据处理 接口 { { pushString(std::string&) I.・・} //处理推送数据 pushlnt(int) j.・・} pushBoolean(boo1) 1.・・} } Class HelloClient:public HelloIf Public: //处理推送数据 //处理推送数据 HelloPushIf&GetPushIf(void);//获取数据推送接口 f Class HelloHandler:public Hellolf,public Connectionlf {//继承连接管理接口Connectionlf中的连接管理方法 { Public: Public: HelloClient(HelloPushCallback&);//推送数据处理回调接口 OnOpen(HelloContext&) {_・-} //处理连接打开 OnClose(HelloContext&) 1.・・} //处理连接关闭 } }当前Thrit客户端在进行服务调用时采用的是在发 f送请求消息后阻塞式的等待请求消息对应的应答消 息的方式。在这种方式下,数据的接收依赖与请求消息的发送,并且发送的消息与接收的消息必须是一对 一的。为了使客户端支持服务端的数据推送,在客户端接口中将数据的接收与发送分离,创建一个单独的 线程接收数据,使数据的接收部依赖于服务请求的发送。采用libevent实现非阻塞的数据接收,位于同一进 程中的所有客户端建立的连接均在libevent中进行注册,并在收到数据后,由libevent触发接收并处理数据。 当接收的数据是服务端推送的数据时调用相应的推送数据处理回调函数;当接收的数据是服务请求的应答 数据时,将数据放人服务请求上下文中,同时通知阻塞的服务调用接口,并由服务调用接口从调用上下文中 提取调用结果数据。客户端处理流程如图3所示。 当前Thrit的服务端传输机制中,当收到一个客户端的调用后,完成对这个调用的响应处理前无法通过 f
3期 杨呖等:基于Thrift的服务端数据推送机制设计 45 该连接发送其他数据。为了使服务调用 和数据推送相互独立,在Thrit的 fTNonblockingServer::TConnection::transition 函数中的传输状态机中增加APP—PUSH 状态用于进行推送数据发送,并在转入 APP—PUSH状态进行数据推送前先保存 当前的传输状态,当数据推送结束后,再 恢复保存的传输状态继续运行。 4实验与分析 针对本文中的基于Thrit的服务端数 f据推送机制进行了性能测试,并针对 Thrit中原有的服务调用的性能将改造后 f与改造前的Thrit进行比较。实验采用 f图3客户端处理流程 Intel Xeon E5—2637 v2处理器,中标麒麟 操作系统,使用1K请求和1K响应数据在 环回地址上进行,结果如表1所示。 从实验结果可以看出,改造后的Thrift 表1 改造前后对服务请求响应时间对比 任然能够以较高的性能实现将服务端数 据向客户端推送,虽然改造对请求一应答 模式的性能造成了一定的影响,但仍处于 可接受的范围。 在同一个实验环境下,针对服务端的 数据推送效率进行了实验,对不同大小的数据每种推送10000次,结果如表2所示。 表2服务端的数据推送效率 从实验结果可以看出,改造后的Thrit能够以较高的效率实现服务端数据的推送。f 由于推送数据与服务调用的应答数据使用同一个TCP链路发送回客户端,因此当有大量数据向客户端 推送时必然会对服务调用的响应时间造成延迟,所以在实际使用中,服务端数据推送应避免定义在对响应 时间有较高要求的服务中,以避免对服务调用的响应时延造成影响。 5 结束语 在分布式架构的计算机系统中,分布部署的业务单元间交换数据的主要模式为“拉取”和“推送”,其中 “推送”模式因为能够避免周期性查询导致的无效请求,所以具有更高的实时性和更小的资源消耗,因此更 加适合对数据时效性有较高要求的场景。本文“基于Thrit的服务端数据推送机制设计”对开源服务化远程 f
46 网络新媒体技术 2017定 访问开发框架Thrift进行改造,在其中增加服务端数据推送机制,为分布式架构的计算机系统提供了提升性 能的有效手段。 参 考 文 献 [1]张刚宁,易侃,蓝羽石,丁峰,王珩游坤.网络中心化C4ISR系统服务架构及运行机制.指挥信息系统与技术,2013,4(6)・ [2]Mark Slee,Aditya Agarwal,Marc Kwiatkowski.Thrift.Scalable.Cross—Language.Services.Implementation[EB/OI一]- (20070401)[2015—10—31].http://thrift.apache.org/static/ les/thrift一20070401.pdf. [3]Diwaker Gupta.Thrift.The.Missing.Guide[EB/OL].(2013—07—09)[2015—10—31].http://diwakergupta.github.io/ thrift—missing—guide. 吴洲.基于Thrift的跨编程语言Flex应用框架研究[J].计算机与现代化,2013,(05):1 81—185 韩冰,祝永志.一种基于Thrift的跨平台单点登录实现方法[J].软件导刊,2014,13(02):48—50 汪牧群,胡莹,叶寒.面向MES的实时数据推送及集成技术研究[J].南昌大学学报(工科版),2015,37(01):42—47 汪红兵,余春东,范植华,李磊,徐帆江.基于JMS的数据推送系统的设计与实现[J].计算机应用,2015,25(12):366 —368 [8]罗广,阳许军.基于web的推送技术在风险预警系统中的应用[J].电子设计工程,2016,24(11):46—48 [9]费日东,李定主.服务器推送技术研究[J].电脑知识与技术,2012,8(07):1516—15l7 作者简介 杨肠,男,(1980一),工程师,研究方向为服务平台软件技术。 汪正舟,男,助理工程师,研究方向为服务平台软件技术。 吴腾,男,助理工程师,研究方向为服务平台软件技术。 (上接第32页) f6]Yan W,She H,Yuan z.Robust Registration of Remote Sensing Image Based on SURF and KCCA[J].Journal of the Indian So— ciety of Remote Sensing,2014,42(2):291—299 [7]Yj z,Cao z,Yang X.Multi—spectral remote image registration based on SIFT[J].Electronics Letters,2008,44(2):107 1O8 [8]岳春宇,江万寿.几何约束和改进SIFT的SAR影像和光学影像自动配准方法[J].测绘学报,2012,41(4):570—576 [9]施文灶,毛政元.采用非线性尺度空间滤波和SIFT的遥感影像配准方法[J].华侨大学学报(自然科学版),2016,37 (1):38—42 [1 0]Yao D,Zhou J,Xue Z.Homography matrix genetic consensus estimation algorithm[c]//International Conference on Audio Language and Image Processing,1 139—1 143 [1 1]Bay H,Ess A,Tuytelaars T,et a1.Speeded—up robust features(SURF)[J].Computer vision and image understanding, 2008,110(3):346—359 [12] Viola P,Jones M.Rapid object detection using a boosted cascade of simple features[C]//Proceedings of the 2001 IEEE Com— puter Society Conference on Computer Vision and Pattern Recognition(CVPR).Colorado,USA:IEEE,200 1.5 1 1—5 1 8 Simard P Y,Bottou L,Haffner P,et a1.Boxlets:a fast convolution algorithm for signal processing and neural networks[C]// [13] Advances in Neural Information Processing Systems,1999:57 1—577 作者简介 施文灶,(1982一),男,博士,现从事高分辨率遥感影像信息提取研究。
本文发布于:2024-02-01 02:33:34,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170672601433234.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |