Thrift是为了解决facebook系统中各系统之间大数据量的传输通信以及系统之间语言环境不一样须要跨平台这一特性而创造的。因此thrift能够支持多种程序语言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多种不一样的语言之间通讯thrift能够做为二进制的高性能的通信中间件,支持数据(对象)序列化和多种类型的RPC服务。 服务器
Thrift适用于程序对程序静态的数据交换,须要先肯定好他的数据结构,他是彻底静态化的,当数据结构发生变化时,必须从新编辑IDL文件、代码生成、再编译载入的流程,跟其余IDL(接口描述语言,Interface Definition Language)工具相比较能够视为是Thrift的弱项。 数据结构
Thrift适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相对于JSON和xml不管在性能、传输大小上有明显的优点。 多线程
Thrift 基础架构
Thrift是一个服务端和客户端的架构体系,从我我的的感官上来看Thrift是一个相似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的东东,Thrift 具备本身内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports),经过IDL脚本对传输数据的数据结构(struct) 和传输数据的业务逻辑(service)根据不一样的运行环境快速的构建相应的代码,而且经过本身内部的序列化机制对传输的数据进行简化和压缩提升高并发、 大型系统中数据交互的成本,下图描绘了Thrift的总体架构,分为6个部分:1.你的业务逻辑实现(You Code黄色部分)
2.客户端和服务端对应的Service (褐色部分)
3.执行读写操做的计算结果(红色部分)
4.TProtocol (紫色部分)
5.TTransports (蓝色部分)
6.底层I/O通讯(灰色部分)
架构
图中前面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通道。 编码