avro-rpc http://code.google.com/p/avro-rpc/
1.开发背景
公司的运营管理平台建立在J2EE平台之上,采用多层分布式的架构体系。分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的)。因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件。
首先总结下我们对这个RPC服务组件的要求:
1. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信。
2. 轻量级,没侵入性,逻辑分层,易维护扩展;
3. 数据序列化方式能支持跨语言(C,C++,Java等)。因为我们有多种语言的客户端版本,能支持多种序列化方式,方便扩展序列化;
4. 希望协议层和传输层逻辑分开。这样方便扩展与重用;方便二次开发,当应用规模变大时,能方便开发“服务治理“;
5. 序列化后的数据要尽可能小。我们的应用要求尽可能的节省用户的流量,所以这点也比较关键;(不考虑压缩,因为压缩会占用比较多的CPU资源)
2.开源参考
于是开始寻找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框架。
3.avro-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
- 大小: 19.6 KB
分享到:
相关推荐
Avro RPC则是Avro的一个重要特性,它提供了一种标准的远程过程调用(RPC)框架,使得基于Avro的数据可以在客户端和服务端之间安全、高效地传输。 **Avro RPC的核心概念** 1. **Schema**: Avro的核心是其Schema定义...
赠送jar包:flink-avro-1.10.0.jar; 赠送原API文档:flink-avro-1.10.0-javadoc.jar; 赠送源代码:flink-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:flink-avro-1.10.0.pom; 包含翻译后的API文档:flink-...
例如,当创建一个新的Avro数据文件时,我们需要先定义一个schema,然后使用`avro-tools compile`命令生成对应的Java类。这些类提供了序列化和反序列化的接口,使得Java程序能够方便地读写Avro数据。 此外,"avro-...
Avro是Apache软件基金会的一个开源项目,它提供了一种数据序列化系统,广泛应用于大数据处理和分布式计算领域。Avro工具jar包是Avro的一部分,主要用于处理Avro格式的数据,包括编译Avro模式,转换数据,以及合并或...
赠送jar包:parquet-avro-1.10.0.jar; 赠送原API文档:parquet-avro-1.10.0-javadoc.jar; 赠送源代码:parquet-avro-1.10.0-sources.jar; 赠送Maven依赖信息文件:parquet-avro-1.10.0.pom; 包含翻译后的API文档...
avro 工具类 java -jar avro-tools-1.8.1.jar tojson --pretty test.avro > output.json
这是关于avro的avro-1.8.1版本的avro-tools的一个jar包
赠送jar包:avro-1.11.0.jar; 赠送原API文档:avro-1.11.0-javadoc.jar; 赠送源代码:avro-1.11.0-sources.jar; 赠送Maven依赖信息文件:avro-1.11.0.pom; 包含翻译后的API文档:avro-1.11.0-javadoc-API文档-...
这是一个关于avro的1.8.2版本的avro-tools-1.8.2的jar包
这个版本的工具包是针对Java环境设计的,因此其主要文件是一个名为"avro-tools-1.3.0.jar"的JAR(Java Archive)文件。 一、Avro工具1.3.0.jar的核心功能: 1. **Schema管理**:Avro数据依赖于schema,Avro-tools...
赠送jar包:avro-ipc-1.8.2.jar; 赠送原API文档:avro-ipc-1.8.2-javadoc.jar; 赠送源代码:avro-ipc-1.8.2-sources.jar; 赠送Maven依赖信息文件:avro-ipc-1.8.2.pom; 包含翻译后的API文档:avro-ipc-1.8.2-...
Apache Avro是一个面向数据序列化的开源框架,由Apache软件基金会开发,主要应用于大数据处理和分布式系统。它提供了高效的、跨语言的数据交换格式和API,特别适合远程过程调用(RPC)以及存储和处理大规模数据集。...
赠送jar包:avro-1.7.4.jar; 赠送原API文档:avro-1.7.4-javadoc.jar; 赠送源代码:avro-1.7.4-sources.jar; 赠送Maven依赖信息文件:avro-1.7.4.pom; 包含翻译后的API文档:avro-1.7.4-javadoc-API文档-中文...
python-avro-json-serializer, 使用AVRO模式将数据序列化为JSON格式 python Avro JSON序列化程序 AvroJsonSerializer 使用AVRO模式将数据序列化为JSON格式。为什么我们需要序列化程序而不只是转到 JSON?验证数据与...
avro-mapred-1.7.7-hadoop2.jar
总之,这个"protobuf/thrift/avro-序列化性能测试工程"为IT专业人员提供了一个实用的参考,帮助他们在实际项目中权衡和选择适合的序列化技术。通过深入研究和理解这些工具的特性和性能,开发者可以优化他们的系统,...
Confluent Schema Registry 在使用java开发生产者以及消费者时的依赖包,在使用时导入到工程即可
hadoop源码部署过程中hadoop-common中的类hadoop-common-project\hadoop-common\src\test\avro有报错,需要使用avro-tools-1.7.4进行编译。
“ avro-rpc-demo”是Java实现的avro rpc的演示代码。 作者:zhexin Pan日期:20151103 简介此项目包括Java中的三个实现演示。 第一个是官方网站的快速入门演示,它是数据序列化和反序列化的两种实现,分别称为...
在MapReduce任务中读取Avro文件,会使用到avro-mapred.jar。 然而目前的avro-mapred.jar是基于较老的版本的,使用时会报错: org.apache.hadoop.mapred.YarnChild: Error running child : java.lang....