一种高性能异步RPC框架的设计与实现

荣乌高速车祸
2018年第3期 信息通信2018
(总第 183 期)INFORMATION&COMMUNICATIONS(Sum.N o 183)
一种高性能异步RPC框架的设计与实现
于天,黄起
(华东师范大学信息科学与技术学院,上海200241)
摘要:为了研究RPC技术的原理以及提高性能和可用性的方案,设计并实现了一种名为P rettyR P C的RPC框架。Pretty 共分三层:公共层,核心层和应用层。整体设计围绕高性能、高可扩展性,高可用性及高易用性等特点进行。采用Netty 高性能异步通信框架用于信息交互;P rotostuff框架提供对象序列化能力;JDK P roxy技术生成代理对象;Spring框架提 供基于Io C的对象管理功能。最终实现了一种符合领期的RPC框架。经过此次研究实践,能够得出如下结论:基于改 进Reactor模式的纯异步线程池通信模型的效率要高于传统多线程同步阻塞的通信模型;序列化算法的效率也是决定 R PC性能的重要因素之一;基于Io C思想的软件设计方式能够有效提升软件的各项指标。
关键词:远程过程调用;序列化;异步通信;Java技术栈;多机系统;软件架构
中图分类号:TP311.5 文献标识码:A文章编号:1673-1131(2018)03-0127-03
The Design and Implementation ofa High-Performance Asynchronous RPC Framework手足口病预防控制指南
Yu Xian,Huang Chang
(East China Normal University,School o f Inform ation Science Technology,Shanghai200241, China)
A bstract:In order to find the the solution to improve Remote Procedure C all(RPC)J s performance and availability technology,
implementing a framework o f R PC named Pretty.There are three layers in this framework:The Communication Layer,the Proxy Layer and the Application Layer.The framework adopts a high-performance asynchronous communication framework named N etty fo r message interaction;The ProtostufF framework provides serialization algorithm;JDK Proxy technology generated proxied objects;Spring framework provides the ab ility o f m anaging Java Objectbased on the technology o f I nversion o f C ontrol (IoC).And it can conclude from the research and practice:The asynchronous communication model w ith thread pool which is based on the improved Reactor pattern,is more efficient than the synchronous and blocked communication model w ith m ulti­thread;The efficiency o f serialization algorithm is one o f important factors to determine the RPC performance;The thought o f the IoC can improve software indicatorsefFectively.
英国版权法
Key words:Remote Procedure C all;Serialization;Asynchronous Communication;Java Technology Stack;M ulti-com puter Ma­chine System;Software Architecture
〇引言
远程过程调用(Remote Procedure C all,RPC)技术被广泛运用在多机系统的通信当中。无论是大规模分布式集或者 是普通多机业务系统,RPC技术一般在其中承担系统协调与 数据交换的责任,而R PC性能和可靠性的高低直接决定了系 统性能和可用性的好坏。
R P C的本质是在客户端要求远程服务端运行某项服务并 获取其结果的过程。它是一种进程间的通信机制,并未规定具 体的实现方式、平台和语言[1_a。所以实现R PC的方式也有很多 种,比如WebService.JD K原生的远程方法调用(Remote Method Invocation RM I)等。但是它们都有自己的局限性:WebService 基于HTTP和X M L,它过于沉重,每一次调用,都会携带大量的 不必要的信息,并进行一次完整的网络连接一断开的操作,严重 影响了高并发情况下的调用效率[3];而R M I则仅支持Java系统 之间的调用,不具有跨平台型,并且由于其序列化性能和通信模 型的限制,其在高并发情况下表现也不尽如人意[4]。
在探讨了以上两个R PC实现的优点和缺点之后,可以总 结RPC技术应当关注的特性有如下几个:通信模型效率,序列 化效率,跨平台兼容性,框架的软件设计指标(如易用性、可维 护性、可靠性等等)
M。而RPC框架—
—P retty正是为了尝试 解决如上的问题。后续也将围绕如上几个特性展开,对比具 体实现进行论证。
1Pretty R PC框架概述吐火罗文
Pretty RPC意为 Protostuff-Netty RPC(后简称为 Pretty),是一种学习研究性质的RPC框架。P retty主要提供给用户配 置、发布和生成引用对象的能力。用户在框架的体系中,以约 定的方式使用框架的全部功能,以简化用户使用RPC框架的 过程,并降低学习成本。
为了保证Pretty整体的可维护性、高复用性和各模块间的低耦合性,可将系统分为3层:公共层,核心层和应用层。
公共层(Common Layer)是整个P retty的最底层,其包含 高性能编解码模块,异步通信模块,通用工具模块。公共层不 关心实际远程调用逻辑,它仅负责对消息进行收发与编解码, 同时为上层模块提供与业务无关的基础服务,比如常量定义,异常定义等。同时,所有的上层模块都依赖于公共层。
核心层(Core Layer)是P retty实现具体调用逻辑的中间 层。其包含两大功能:引用者(Reference)和发布者(Publisher),二者通过自定义远程通信协议建立松耦合关系。引用者即客 户端,用户使用弓丨用者生成代理对象(Proxy Object),并通过代 理对象调用远程服务,隐藏远程调用的逻辑,让用户能
够更加 专注于业务的实现。发布者即服务端,用户可以通过创建发 布者,并向发布者注册服务,以达到发布服务的目的,任何客 户端都可以远程调用指定发布者已经成功发布的服务,并获 得服务执行结果。
应用层(Application Layer)是开放给用户使用的层次,为了让用户能够更加容易的使用Pretty,应用层提供了两个模块:基础应用编程接口(Application Programming Interface,API)模块和Spring模块。一般情况下,基础A P I模块可以提供Pretty所有的功能给用户使用。不过为了提高Pretty兼容性
127
和开放性,并支持在大规模系统中使用,另外借助基于控制反转(Inversion o f C ontrol,IoC)设计思想的 Spring框架实现 Pr©" tty中的Spring模块〇
分层结构如图1所示,上层依赖下层,各模块功能独立专
应用层
S p rin g集成模块
引用者模块A P I发布者模块A P I
2 Pretty RPC框架实现
P retty框架采用Java语言编写,并使用M aven构建项目工程,根据框架分层,可以将整个P retty项目拆分为五个子项目:公共项目、引用者项目、发布者项目、Spring集成项目、测试项目。
通过明确的拆分,可以有效地增加项目整体的可维护性:各个项目之间除一些常量的引用,彼此之间的依赖都是通过接口实现的,这样一来便达成了针对接口编程的设计原则,有效降低了改动代码带来的额外维护成本。同时,拆分过后的项目模块化程度高,扩展时更易针对某个模块扩展,也可以降低P retty框架各模块间的耦合程度。
2.1公共实现
公共项目属于公共层,它提供一些公共的模块给其它层和模块使用。其分为如下几个主要模块:编解码模块、通信模块、通用工具模块。
编解码模块:由P rotostuff提供编解码能力,Pretty在P ro tostuff的基础上,封装一个编解码工具类,将其编解码能力以静态方法的方式提供给通信模块使用。同时由于P rotostuff以P rotobuff的协议编码所以其具有平台无关性,可以在非Java 的系统中,用P rotobuff提供的编解码协议解析编码结果。由此为P retty预留了一定的平台扩展性。
通信模块:基于N etty框架及反应器(Reactor)模式实现B1,整个通信流程完全异步化:有一组接收者(Acc印tor)线程池负责接入网络通信的请求,然后将请求交给Reactor线程池, actor线程池再将请求分发给用户注册的处理器(Handler),并对请求的原始数据进行基本的处理,比如编解码和校验等。最终将初步处理得到的请求与响应交给业务线程池进行进一步处理,比如运行请求所指定的服务,并将结果返回等。
相比于传统的请求与线程一一对应的IO设计模式,Reac> tor模式采取线程池方式异步处理请求,降低了线程间上下文切换的开销,提髙了线程资源的利用效率。同时由于将1〇逻辑和业务逻辑区分开,也防止了业务逻辑阻塞导致10饥渴的问题,最终提髙了框架整体的10效率。
通用工具模块:是整个Pretty公用的一些工具,比如状态码定义,异常定义等。其特点是业务逻辑无关性与较髙的复用性,很多上层模块也会用到这些工具,为了统一管理,所以Pretty提供了一个通用工具模块,开放给所有的其它模块。2.2引用者实现
引用者项目是用户在使用Pretty客户端时所需要依赖的项目。引用项目本身仅依赖于公共项目,用户如果仅使用Pretty 客户端,只需要在自己的项目中依赖引用者项目和公共项目即可。弓丨用者模块同时支持同步与异步的方式获取R P C结果,同时也支持用户在执行远程调用建立连接时,自由选择长连接或短连接的连接策略。
弓I用者项目主要可以分为A P I模块,代理模块和连接器模块。
A P I模块:为用户提供弓丨用服务的功能。
代理模块:根据配置,引用者将利用JDK Proxy技术生成同步或异步的代理对象,用户通过操作代理对象,完成RPC的调用过程。其中代舰象可以理解为对务端对应服务的一个本地引用。代理对象封装了远程调用的功能,该调用行为最终被交给连接器模块进行下一步的处理。而之后,如果代理对象是同步的,则在调用后阻塞线程,等待调用结果返回;如果代理对象是异步的则调用后立刻返回,但并不包含结果,调用结果将在从服务端返回后,提交给己经成功注册的回调函数,去运行用户逻辑。这种异步返回结果的方式可以帮助用户降低线程阻塞所带来的线程等待时间。
连接器模块:包装调用操作为一个请求,利用通信模块实例化一个通信对象,通过该对象异步的发送与接收请求,当接收到结果时,将其通过回调函数的方式返回给代理模块。
另外,在通信过程当中,为了保证信道的髙效利用,避免在信道的建立与断开上面消耗过多的性能,对于每一次请求,连接器在接收到结果以后,并不会断开连接,而是会根据配置决定连接的处理策略:现有长连接和短连接两种方式。短连接在每次调用后,会有一定时间(可配置)的等待期,当空闲时间(没有请求发出)超过等待期,则断开连接。而长连接则永远不会断开连接,如果意外断开,长连接模式的连接器会尝试自动重连。
连接器模块和代理模块在设计思路上基本一致,可以互通。连接器有长、短连接两种方式,代理模块有同步、异步两种模式,下面介绍连接器的设计思路:根据面向对象程序设计(Object Qriaited Programming,OOP)思想,封装连接器的长短连接模式,统一抽象为一个接口'在使用过程中,根据配置提供信息,引用者会自动使用对应的工厂(Factory)类,生成基于长连接的或者短连接的连接器。代理模块使用连接器时,是多态的使用方式,代理模块并不感知该连接器的连接方式是长连接还是短连接,以达到模块间解耦,同时保证模块功能专一的目的。
2.3发布者实现
发布者项目作为Pretty的服务端,它提供了服务的发布与执行功能,同样依赖于公共层,一个发布者可以发布多个服务,一台机器同时可以部署多个发布者(它们提供服务的端口号会不一样)。同时,发布者并不和引用者互斥,二者同时可以出现在一个系统当中,互相提供R P C的调用服务,以此保证Pretty框架的灵活性。
128
发布者分为四个模块:A P I模块,服务发布模块,服务调用 模块和连接模块。
A P I模块:为用户提供发布服务的功能。
服务发布模块:通过配置,将一个与发布者存在于同一个 Java虚拟机(Java V irtual Machine,JVM)的对象,作为服务注 册到发布者当中,并通过发布者将服务发布出来,可供引用者 远程调用。被注册的服务必须实现任意一个接口,引用者也 是通过同样的接口生成代理对象,并对代理对象进行方法调 用,最终通过远程通信的方式,完成R PC调用的过程。
服务调用模块:通过连接模块,接收到服务调用请求,根 据请求寻对应的已经注册并发布的服务,然后提交到线程 池中执行相关方法,并将结果再通过连接模块返回给引用者,整个过程完全异步化,以提高发布者处理请求的能力。
连接模块:发布者的连接模块相比于引用者的连接器模 块,它并不关心长短连接的问题,它通过在空闲时发送心跳包, 以判断引用者是否在线,如果连接没有被引用者主动关闭,而 心跳包又没有返回心跳帧,则由发布者的连接模块主动关闭 连接,节省1〇资源。
2.4 Spring集成
Spring作为Java技术最为重要的一个框架,它的IoC 思想被广泛运用在各种大型系统的设计与开发当中[1°]。
为了使P retty支持Spring,基于引用者和发布者的A P I, P retty在此之上,又提供了一个Spring集成模块,该模块提供 了自定义的X M L标签,用户可以通过依赖Spring集成模块和 引用者或发布者模块,在S pring的X M L中配置并使用Pretty 的全部功能。
每一个引用者和发布者以及注册到发布者中的服务,都 是一个存在于S pring的Io C容器中的Bean,它们更易被管理 和进行依赖注入(DependencyInjection,D I)。同时由于用户通 过S pring的X M L进行配置,所以在代码当中,P re tty的初始 化和底层运行细节被隐藏的更加彻底,对用户代码的侵入更 小,使得用户代码的可维护性也有了非常大的提高。
2.5测试
任何框架或系统都需要进行测试,以保证其可以正常和 高效的运行。P retty采用两种测试策略:单元测试(U nit Test,U T)和系统集成测试(System Integration Test,SIT)。由于每个 模块对外开放的都是接口,所以可以针对这些接口进行模块 化的单元测试,检测其输入输出是否符合预期。而系统集成 测试则从A P I层面开始,进行不同的配置,检测系统整体是否 可用。
3性能分析
为验证P re tty的性能,选取了两种主流的其它R PC实现 框架:D ubbo以及J D K R M I进行对比。其中
Dubbo框架配置 为Dubbo通信协议,Hessian2序列化协议,N etty通信。而R M I 直接使用JavaNIO框架,以及Java序列化协议。
服务端和客户端都部署在统一局域网中,带宽为100M。
服务器配置如下:E3-1230v3 CPU,4G*2 R A M。客户机配 置如下:I7-4720HQ CPU,4G*2 R A M。
所有测试统一调用一个Echo方法,即发送一个大小适当 对象(内存中有效数据约为400Byte S),然后将该对象原样返 回,在避免业务服务性能消耗影响测试结果的前提下,测试通 信和序列化效率。
测试用例如下:1个客户端(Clients,C),每个10万次调用(Calls Per C lient,CPC);20个客户端并发,每个10万次调 用,共200万次请求;100个客户端,每个10万次请求,共1000
万次请求。分别记录三种情况的总耗时(Time,T),并根据式(1)计算每秒调用次数(Calls Per Seconds,CPS),该指标越高
表示RPC框架性能越强。其中,每个客户端表示客户机上面
一个执行RPC任务的线程。
表1性能测试结果
框架客户端数总调用次总耗时(秒)CPS
Pretty1100,000234347
RMI1100,000382,631
Dubbo1100,000342^41
Pretty
RMI
20
20
2,000,000
2,000,000
78
125
25.641
16,000 Dubbo202,000,00011118,018
Pretty
RMI
10010,000,00038326,101
10010,000,00065715^14 Dubbo10010,000,00057117,504
根据表1,可以看出,P retty在测试条件下,总耗时及CPS
皆由于Dubbo和R M I,同时在并发数上升时,得益于高效的异
步通信模型结构,和序列化协议,P retty的稳定性更强,CPS更 高,平均相对于R M I提高39%,相对于Dubbo提高30%。
4结论
Pretty有如下特性,保证了其能够达到预期的设计指标。①
良好的框架分层架构提供了在未来进一步扩展和维护的可能 性。②基于改进R eactor模式的高性能的异步通信模型能带
来更高的通信效率。③序列化协议的性能高低决定了 RPC传
输过程中的编解码效率,从而影响在较大访问量下的调用性 能。④使用Spring管理对象,可以更好地隐藏RPC底层细节,
以及提高可维护性和代码的易读性。
参考文献:
[1]王纪臣.异步R P C的设计与实现[D].吉林大学,2005.
[2]刘晓风.多线程RPC分布式计算的实现[J].计算机工程与
设计,2003(03):24-26+29.
[3]李凤云,黄迎春,冯永新.基于W ebService的S O A实现技
术研究[J].科技视界,2012(23):17-19.
[4]高雅侠,邹海荣.基于Java的R M I技术的研究与应用[J].
计算机与数字工程,2011,39(08):174-177.
难忘的校园
[5]韩星,刘姣,周淑君.基于N e tty的RPC通信系统的编解码
技术研究[J].电脑知识与技术,2017,13(26):104-105+107.
[6]周岚.基于Spring框架的IO C模式的设计和实现[J].合肥
学院学报(自然科学版),2011,21(01):49-53.Zhou Lan.
躲羊羊[7]王斌斌.基于P rotobuf的RPC系统的设计与实现[D].电
子科技大学,2016.
[8]李璞,张玲,胡术,潘倩,李艳.多线程环境下Reactor模式的
研究与实现[J].网络新媒体技术,2017,6(02):52-57.
[9]吴晴.面向对象思想在软件设计中的应用[D].吉林大学,2004.
[10] 魏学松,张育平.IO C框架的研究与设计[J].计算机技术与
发展,2006(03):213-216.
作者简介:于天(1992-),男,硕士研究生,主要研究方向:图像
处理,软件工程。
129

本文发布于:2024-09-22 19:35:23,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/46396.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模块   调用   服务
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议