您的位置:首页 > 其它

RPC框架比较

2017-05-02 16:19 253 查看
[align=left]什么是RPC:[/align]
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。

简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。

比较关键的一些方面包括,通讯协议,序列化,资源(接口)描述,服务框架,性能,语言支持等。

[align=left]典型RPC调用框架:[/align]
[align=left]RPC的实现和调用框架,五花八门,简单介绍其中几种比较典型的:[/align]
[align=left]RMI,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。[/align]

Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。

protobuf-rpc-pro,是一个Java类库,提供了基于 Google 的 Protocol Buffers 协议的远程方法调用的框架。基于 Netty 底层的 NIO 技术。支持 TCP 重用/ keep-alive、SSL加密、RPC 调用取消操作、嵌入式日志等功能。

[align=left]Thrift,是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。[/align]
最初由facebook开发用做系统内个语言之间的RPC通信,2007年由facebook贡献到apache基金 ,现在是apache下的opensource之一 。支持多种语言之间的RPC方式的通信:php语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。底层通讯基于SOCKET。

Avro,出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下推出Avro的目标不仅是提供一套类似Thrift的通讯中间件,更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。支持HTTP,TCP两种协议。

[align=left]RPC调用框架的过程原理基本类似,以Thrift为例[/align]
[align=left]Thrift 协议栈以及各层的使用(java 为例) [/align]



[align=left]1、model interface [/align]
[align=left]服务的调用接口以及接口参数model、返回值model [/align]

[align=left]2、Tprotocol 协议层 [/align]
[align=left]将数据(model)编码 、解码[/align]

[align=left]3、Ttramsport 传输层 [/align]
[align=left]编码后的数据传输(简单socket、http) [/align]

[align=left]5、Tserver [/align]
[align=left]服务的Tserver类型,实现了几种rpc调用(多线程、单线程非阻塞IO、多线程非阻塞IO)[/align]

[align=left]RPC调用框架比较:[/align]

[align=left]Thrift与protobuf-rpc-pro比较[/align]
1、Another important difference are the languages supported by default.

[align=left]protobuf: Java, C++, Python [/align]
Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml

[align=left]支持语言不同,thrift支持着更多的语言 [/align]

2、Thrift supports ‘exceptions 。

[align=left]thrift支持服务的异常。[/align]

3、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice.

[align=left]Protocol Buffers 在文档方面比thrift丰富,而且比thrift简单。[/align]

4、Protobuf serialized objects are about 30% smaller then Thrift.

[align=left]Protocol Buffers在序列化/反序列化、传输上性能更优。[/align]

5、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.

[align=left]thrift提供了一套完整的rpc服务实现(多线程socket、单线程非阻塞的socket、多线程非阻塞socket)[/align]

6、And according to the wiki the Thrift runtime doesn't run on Windows.

[align=left]thrift 对有些语言在windows上不支持:C++[/align]
摘选自:http://gemantic.iteye.com/blog/1199214 thrift的使用介绍

[align=left]Apache Avro 与 Thrift 比较[/align]
转自网络,http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml

[align=left]文章有比较详细的对比,值得仔细研读。摘部分内容,如下。 [/align]
[align=left]Avro和Thrift都是跨语言,基于二进制的高性能的通讯中间件。它们都提供了数据序列化的功能和RPC服务。总体功能上类似,但是哲学不一样。[/align]
[align=left]Thrift出自Facebook用于后台各个服务间的通讯,Thrift的设计强调统一的编程接口的多语言通讯框架。Avro出自Hadoop之父Doug Cutting, 在Thrift已经相当流行的情况下Avro的推出,其目标不仅是提供一套类似Thrift的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和存储的Protocol。[/align]
这个和Thrift的理念不同,Thrift认为没有一个完美的方案可以解决所有问题,因此尽量保持一个Neutral框架,插入不同的实现并互相交互。而Avro偏向实用,排斥多种方案带来的可能的混乱,主张建立一个统一的标准,并不介意采用特定的优化。Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL等即属于Ad-Hoc(点对点)模式,又追求性能的应用需求。

[align=left]目前阶段Thrift比Avro支持的语言更丰富. [/align]
Thrift: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.

Avro: C, C++, Java, Python, Ruby, PHP.

[align=left]Schema处理方法截然不同: [/align]
Thrift是一个面向编程的系统, 完全依赖于IDL->Binding Language的代码生成。

Avro支持2种方式。Avro-specific方式和Thrift的方式相似,依赖代码生成产生特定的类,并内嵌JSON Schema. Avro-generic方式支持Schema的动态加载,用通用的结构(map)代表数据对象,不需要编译加载直接就可以处理新的数据源。

Avro的Schema文件有三种格式,依次是avdl,avpr,avsc,后两种是json格式,avdl可以转成avpr。

[align=left]java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr[/align]

[align=left]关于序列化:[/align]
avro的机制,有更好的数据的透明度和可操作性,更高的存储效率。

[align=left]Thrift提供了多种序列化的实现: [/align]
TCompactProtocol: 最高效的二进制序列化协议,但并不是所有的绑定语言都支持。

TBinaryProtocol: 缺省简单二进制序列化协议.

[align=left]RPC服务:[/align]
[align=left]Avro提供了
[/align]
[align=left]HttpServer : 缺省,基于Jetty内核的服务[/align]
[align=left]NettyServer: 新的基于Netty的服务[/align]

[align=left]Thrift提供了: [/align]
[align=left]TThreadPolServer: 多线程服务 [/align]
TNonBlockingServer: 单线程 non blocking的服务

THsHaServer: 多线程 non blocking的服务

[align=left]性能测试Benchmarking,两者差相仿佛。 [/align]

[align=left]Conclusion:[/align]
Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定。

Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift。

Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台。

[align=left]目前Thrift的优势在于更多的语言支持和相对成熟 [/align]

[align=left]比较分析结论: [/align]
[align=left]基于以上三种框架比较分析,个人决定采用AVRO框架。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RPC框架