Avro RPC 对比测试

标签: avro rpc 测试 | 发表时间:2016-04-19 19:46 | 作者:aoyouzi
出处:http://www.iteye.com

J2EE平台常采用多层分布式的架构体系。分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的)。因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件。

RPC服务组件的要求:
1. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信。

2. 轻量级,没侵入性,逻辑分层,易维护扩展;

3. 数据序列化方式能支持跨语言(C,C++,Java等)。因为我们有多种语言的客户端版本,能支持多种序列化方式,方便扩展序列化;

4. 希望协议层和传输层逻辑分开。这样方便扩展与重用;方便二次开发,当应用规模变大时,能方便开发“服务治理“;

5. 序列化后的数据要尽可能小。我们的应用要求尽可能的节省用户的流量,所以这点也比较关键;(不考虑压缩,因为压缩会占用比较多的CPU资源)

Java领域中的RPC开源方案:

1. Avro   http://avro.apache.org/ 大名鼎鼎的Hadoop的子项目。它本身即是一个序列化框架,同时也实现RPC的功能;

Avro序列化特点:支持跨语言实现,与 Apache Thrift 和Google的Protocol Buffers相比,Avro的优势在于支持动态模式,即可以不生成代码,避免了侵入性,作为POJO的DTO(数据传输对象)是不适合用代码生成的。还有Avro序列化时由于不需要字段标识符来打标签,所以使用它序列化生成的数据小(应该是现有序列化系统中最精简的了),最后它的性能也非常优秀。Avro自带的RPC实现有自己的亮点,比如支持同步和异步调用,有握手协议功能,状态监控完善。但是它绑定了Avro序列化,不支持协议的扩展,也不支持扩展序列化方式,在扩展性上有待改进。

2. nfs-rpc  http://code.google.com/p/nfs-rpc/ 淘宝牛人开源的一个RPC框架。传输层使用mina/netty,协议层灵活可扩展,支持多种序列化方式目前支持Hessian ,Java,Protocol Buffers,序列化方式可扩展。该框架设计非常优秀,代码质量高,可读性强,结构清晰,层次分明。nfs-rpc是一个非常优秀的RPC基础框架,在它的基础上进行扩展开发也非常方便。从序列化方式来看Java序列化虽然使用简单,但性能不高,不能跨语言。Hessian,能跨语言,使用也很方便,但性能不占优势。

3. Dubbo  http://code.alibabatech.com/wiki/display/dubbo/Home-zh 阿里开源的一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。功能非常强大,尤其是提供了完善的服务治理功能,非常适合大型的分布式应用。但是对于中小型应用来说似乎有点太重了。

总结:
1) 从序列化方式来看,Apache Thrift 和Google的Protocol Buffers和Avro应该是属于同一个级别的框架,都能跨语言,性能优秀,数据精简,但是Avro的动态模式(不用生成代码,而且性能很好)这个特点让人非常喜欢,比较适合RPC的数据交换。

2) RPC逻辑上分为二层,一是传输层,负责网络通信;二是协议层,将数据按照一定协议格式打包和解包。 决定参考前面三个开源框架的特点,实现一个轻量级的RPC框架。

avro-rpc 是一个支持跨语言实现的RPC服务框架。非常轻量级,实现简洁,使用方便,同时也方便使用者进行二次开发,逻辑上该框架分为两层:
1:网络传输层。使用Netty的Nio实现。

2:协议层。可扩展目前支持的数据序列化方式有Avro,Json, Hessian,Java序列化。 使用者可以注册自己的协议格式及序列化方式。

主要特点:

1:客户端传输层与应用层逻辑分离,传输层主要职责包括创建连接,连接查找与复用,传输数据,接收服务端回复后回调应用层;

2:客户端支持同步调用和异步调用。服务异步化能很好的提高系统吞吐量,建议使用异步调用。为防止异步发送请求过快,客户端增加了“请求流量限制”功能,调用超时管理。

3:服务端有一个协议注册工厂和序列化注册工厂。这样方便针对不同的应用场景来定制服务方式。RPC应该只是服务方式的一种。在分布式的系统架构中,分布式节点之间的通信会存在多种方式,比如MQ的TOP消息,一个消息可以有多个订阅者。因此avro-rpc不仅仅是一个RPC服务框架,还是一个分布式通信的一个基础骨架,提供了很好的扩展性;

4:非常轻量级,性能好,适合二次开发。

运行性能测试实例
启动服务端 code.google.dsf.test.StartServerTest
运行客户端 code.google.dsf.test.performance.RPSTest
测试对象,客户端采用异步方式发送一个POJO(10个属性字段)对象
两台,一台运行客户端,一台运行服务端,配置如下:
• CPU: E5645 @ 2.40GHz 2 core
• Memory: 2G
• Network: 1000Mb
JVM Options: -server -XX:+UseParallelGC  -XX:+AggressiveOpts -XX:+UseFastAccessorMethods -Xms512M -Xmx1024M
程序执行6分钟,RPS: 70308

补充:通过优化后在相同环境下,最新测试 RPS为:100937


 
 


已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [avro rpc 测试] 推荐:

Avro RPC 对比测试

- - 行业应用 - ITeye博客
J2EE平台常采用多层分布式的架构体系. 分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的). 因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信.

基于dubbo框架下的RPC通讯协议性能测试 - lengfo

- - 博客园_首页
  Dubbo RPC服务框架支持丰富的传输协议、序列化方式等通讯相关的配置和扩展. 更多关于dubbo详细介绍请参照官方文档( http://alibaba.github.io/dubbo-doc-static/Home-zh.htm).   1、支持常见的传输协议:RMI、Dubbo、Hessain、WebService、Http等,其中Dubbo和RMI协议基于TCP实现,Hessian和WebService基于HTTP实现.

Hadoop RPC机制

- - 企业架构 - ITeye博客
RPC(Remote Procedure Call Protocol)远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议. Hadoop底层的交互都是通过 rpc进行的. 例如:datanode和namenode 、tasktracker和jobtracker、secondary namenode和namenode之间的通信都是通过rpc实现的.

用Hadoop AVRO进行大量小文件的处理

- - CSDN博客云计算推荐文章
使用 使用使用 使用 HDFS 保存大量小文件的缺点:. 1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据. 据统计,每一个文件需要消耗 NameNode600 字节内存. 如果需要保存大量的小文件会对NameNode 造成极大的压力. 2.如果采用 Hadoop MapReduce 进行小文件的处理,那么 Mapper 的个数就会跟小文件的个数成线性相关(备注:FileInputFormat 默认只对大于 HDFS Block Size的文件进行划分).

Thrift、protocolbuffer、avro这几种序列化之间的比较

- - 企业架构 - ITeye博客
        thrift和avro都提供rpc服务和序列化,而protocol buffer只是提供序列化功能.         thrift是一个跨语言的轻量级RPC消息和数据交换框架,Thrift能生成的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml.

JAVA RPC 通讯框架

- - 经验沉淀 知识结晶
Bison 是一个JAVA 程间的通信框架,基于apache mina 实现,对mina进行了byteBuffer 缓冲区重用以及半包出处时减少拷贝. 客户端(bison-client) 功能点. 2 支持高用性:高可用的一个基本原则,可以接受快速的失败,但不能接受长时间的等待. Githup地址:https://github.com/gavenpeng/Bison.

RPC原理详解 - 永志

- - 博客园_首页
RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性.  为实现该目标,RPC 框架需提供一种透明调用机制让使用者不必显式的区分本地调用和远程调用. 下面我们将具体细化 stub 结构的实现. 客户方等待调用执行完成并返回结果. 客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果.

zmq-rpc:基于zeromq网络层编写的protobuf RPC框架

- Shengbin - codedump
阅读过zmq的代码之后,感觉这个网络层是我目前见过最高效的–线程之间使用lockfree的消息队列保存消息,可以启动多个I/O线程分担压力等等特性.于是决定基于它写一个protobuf RPC的框架.. 另外,这里使用的protobuf是旧版本2.3.0,新版本2.4.1的生成的RPC service接口跟原来不太一致,暂时还没有去研究它.BTW,升级版本之后导致原来的接口发生变化这是一个很操蛋的事情..

【RPC框架HttpInvoker一】HttpInvoker:Spring自带RPC框架

- - 开源软件 - ITeye博客
HttpInvoker是Spring原生的RPC调用框架,HttpInvoker同Burlap和Hessian一样,提供了一致的服务Exporter以及客户端的服务代理工厂Bean,这篇文章主要是复制粘贴了Hessian与Spring集成一文,. 【RPC框架Hessian四】Hessian与Spring集成.

集成libevent,google protobuf的RPC框架

- goodman - C++博客-那谁的技术博客
chenshuo的evproto同样也是集成libevent与google protobuf的RPC框架,不过在对libevent的使用上,这里的做法与他不尽相同:. 1) 他使用了libevent自带的RPC功能, 而这里只使用到libevent对网络I/O进行的封装的最基本的功能.. eventrpc项目目前是avidya下的一个子项目,avidya项目的定位是实现一些分布式的玩具系统(比如google已经公开论文的chubby,mapreduce,GFS等),也许以后不一定能被用上,但是也要实践做一把.由于有一个好用的RPC框架是做分布式的必需品,所有首先实现eventrpc这个子项目了,以后也许还会实现其他语言的版本,如python,java..