什么是Thrift,Thrift


起源

  • 百度百科怎么说
   thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,
 JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。
   thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器。
   thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
  • 互动百科的观点
   Thrift是Facebook的核心技术框架之一,使不同语言开发的系统可以通过该框架进行通信。开发者使用thrift提供的格式来定义数据和服务脚本。thrift可以通过定义的脚本自动生成不同语言的代
码以支持不同语言之间的通信。thrift支持多种数据通信协议,比如xml,jason,binnary等等。
   Thrift并不是唯一的跨语言通信框架,像google的protocol buffers也是与之类似的框架。关于两者之前的比较可以去google一下。
  • 我的总结
   Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的 facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输
通信以及系统之间语言环境不同需要跨平台的特性。所以thrift可以支持多种程序语言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不
同的语言之间通信thrift可以作为二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。

特性

  • 框架
  • 开源项目
  • 通讯中间件
  • 跨语言
  • RPC服务(Remote Procedure Call Protocol——远程过程调用协议)
  • IDL工具(Interface Description Language——接口描述语言)
  • 高并发
  • TCompactProtocol协议

基础架构

说明:图中前面3个部分是1.你通过Thrift脚本文件生成的代码,2.图中的褐色框部分是你根据生成代码构建的客户端和处理器的代码,3.图中红色的部分是2 端产生的计算结果。从TProtocol下面3个部分是Thrift的传输体系和传输协议以及底层I/O通信,Thrift并且提供 堵塞、非阻塞,单线程、多线程的模式运行在服务器上,还可以配合服务器/容器一起运行,可以和现有JEE服务器/Web容器无缝的结合。

数据类型

  • Base Types:基本类型
  • Struct:结构体类型
  • Container:容器类型,即List、Set、Map
  • Exception:异常类型
  • Service: 定义对象的接口,和一系列方法

协议

Thrift可以让你选择客户端与服务端之间传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这需要根据项目/产品中的实际需求:

  • TBinaryProtocol – 二进制编码格式进行数据传输。
  • TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
  • TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
  • TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
  • TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

传输层

  • TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
  • TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
  • TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
  • TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。
  • TZlibTransport- 使用执行zlib压缩,不提供Java的实现。

服务端类型

  • TSimpleServer - 单线程服务器端使用标准的堵塞式I/O。
  • TThreadPoolServer - 多线程服务器端使用标准的堵塞式I/O。
  • TNonblockingServer – 多线程服务器端使用非堵塞式I/O,并且实现了Java中的NIO通道。

货比三家

Thrift与其他传输方式的比较

假定需要传输相同的内容,但使用不同的方式从1、传输内容所产生的大小 2、传输过程中服务端和客户端所产生的开销,这2个方便进行比较。使用Thrift和其他方式的所产生的内容大小比较结果如下:Thrift-size.png

在上图中我们能明显看出,最臃肿的是RMI,其次是xml,使用Thrift的TCompactProtocol协议和Google 的 Protocol Buffers 相差的不算太多,相比而言还是Google 的 Protocol Buffers效果最佳。Thrift-load.png

谁在用

Quora.gif

Thrift用于Quara系统后端数据的通信,服务端是用C++来实现的,客户端则是python。
Quara背景:Quara是在线问答服务公司,类似新浪微博和百度知道的合体,消息灵通人士透露,去年Quara获得了1400万美元投资,目前他们只有9名员工。
原文:http://www.philwhln.com/quoras-technology-examined#thrift

Evernote-logo.gif.png

Thrift用于在多种Evernote API平台开发的客户端与Evernote服务器之间的通信与数据传输,Evernote API定义了自己的Evernote Data Access and Management (EDAM) 协议规范,让客户端使用更小的网络带宽上传、下载文件和在线即时搜索服务。
Evernote 背景:EverNote是一款非常著名的免费软件,它最大的特点就是支持多平台,而且数据能通过网络互相同步。譬如说,你可以随时在手机上的Evernote新增笔记,回家后在电脑上也能看到它了!
原文:http://www.evernote.com/about/developer/api/evernote-api.htm
HBase 中的Thrift
Thrift用于HBase中是为了提供跨平台的服务接口,在HBase 中可以使用[hbase-root]/bin/hbase thrift start 命令启动涵盖Thrift的HBase服务端,客户端通过thrift的命令生成不同版本的客户端代码,根据定义的数据格式,对远程HBase服务端进行 操作,是除了REST远程方法调用的另一种途径。
参见:http://wiki.apache.org/hadoop/Hbase/ThriftApi

调研结论

相关内容