分享

RPC框架比较

 quasiceo 2016-07-14
什么是RPC:
RPC(Remote Procedure Call Protocol)——远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
简言之,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。
比较关键的一些方面包括,通讯协议,序列化,资源(接口)描述,服务框架,性能,语言支持等。

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

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

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

Thrift,是一种可伸缩的跨语言服务的软件框架。它拥有功能强大的代码生成引擎,无缝地支持C + +,C#,Java,Python和PHP和Ruby。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。
最初由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两种协议。

RPC调用框架的过程原理基本类似,以Thrift为例
Thrift 协议栈以及各层的使用(java 为例)
1、model interface
服务的调用接口以及接口参数model、返回值model

2、Tprotocol 协议层
将数据(model)编码 、解码

3、Ttramsport 传输层
编码后的数据传输(简单socket、http)

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

RPC调用框架比较:

Thrift与protobuf-rpc-pro比较
1、Another important difference are the languages supported by default.
protobuf: Java, C++, Python
Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml
支持语言不同,thrift支持着更多的语言

2、Thrift supports ‘exceptions 。
thrift支持服务的异常。

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.
Protocol Buffers 在文档方面比thrift丰富,而且比thrift简单。

4、Protobuf serialized objects are about 30% smaller then Thrift.
Protocol Buffers在序列化/反序列化、传输上性能更优。

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.
thrift提供了一套完整的rpc服务实现(多线程socket、单线程非阻塞的socket、多线程非阻塞socket)

6、And according to the wiki the Thrift runtime doesn't run on Windows.
thrift 对有些语言在windows上不支持:C++
摘选自:http://gemantic./blog/1199214 thrift的使用介绍

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

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

Schema处理方法截然不同:
Thrift是一个面向编程的系统, 完全依赖于IDL->Binding Language的代码生成。
Avro支持2种方式。Avro-specific方式和Thrift的方式相似,依赖代码生成产生特定的类,并内嵌JSON Schema. Avro-generic方式支持Schema的动态加载,用通用的结构(map)代表数据对象,不需要编译加载直接就可以处理新的数据源。

Avro的Schema文件有三种格式,依次是avdl,avpr,avsc,后两种是json格式,avdl可以转成avpr。
java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr

关于序列化:
avro的机制,有更好的数据的透明度和可操作性,更高的存储效率。
Thrift提供了多种序列化的实现:
TCompactProtocol: 最高效的二进制序列化协议,但并不是所有的绑定语言都支持。
TBinaryProtocol: 缺省简单二进制序列化协议.

RPC服务:
Avro提供了
HttpServer : 缺省,基于Jetty内核的服务
NettyServer: 新的基于Netty的服务

Thrift提供了:
TThreadPolServer: 多线程服务
TNonBlockingServer: 单线程 non blocking的服务
THsHaServer: 多线程 non blocking的服务

性能测试Benchmarking,两者差相仿佛。

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

Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift。
Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台。

目前Thrift的优势在于更多的语言支持和相对成熟

比较分析结论:
基于以上三种框架比较分析,个人决定采用AVRO框架。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多