thrift :2007年facebook开发的协议

更新时间:2024-09-20 23:20

Thrift是一种接口描述语言和二进制通讯协议,它被用来定义和创建跨语言的服务。它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。

软件介绍

Thrift由C++编写,但可以为众多语言创建代码。要创建一个Thrift服务,必须写一些Thrift文件来描述它,为目标语言生成代码,并且写一些代码来启动服务器及从客户端调用它。

Thrift将由这个描述信息生成独立的代码。例如,在Java里,PhoneType将是Phone类中一个简单的enum。

发展历程

thrift最初由facebook开发用做系统内各语言之间的RPC通信。2007年由facebook贡献到apache基金,08年5月进入apache孵化器。支持多种语言之间的RPC方式的通信:PHP语言client可以构造一个对象,调用相应的服务方法来调用java语言的服务,跨越语言的C/S RPC调用。

软件架构

Thrift包含一套完整的栈来创建客户端和服务端程序。顶层部分是由Thrift定义生成的代码。而服务则由这个文件客户端和处理器代码生成。在生成的代码里会创建不同于内建类型的数据结构,并将其作为结果发送。协议和传输层是运行时库的一部分。有了Thrift,就可以定义一个服务或改变通讯和传输协议,而无需重新编译代码。除了客户端部分之外,Thrift还包括服务器基础设施来集成协议和传输,如阻塞、非阻塞及多线程服务器。栈中作为I/O基础的部分对于不同的语言则有不同的实现。

Thrift支持众多通讯协议:

TBinaryProtocol – 一种简单的二进制格式,简单,但没有为空间效率而优化。比文本协议处理起来更快,但更难于调试。

TCompactProtocol – 更紧凑的二进制格式,处理起来通常同样高效。

TDebugProtocol – 一种人类可读的文本格式,用来协助调试。

TDenseProtocol – 与TCompactProtocol类似,将传输数据的元信息剥离。

TJSONProtocol – 使用JSON对数据编码。

TSimpleJSONProtocol – 一种只写协议,它不能被Thrift解析,因为它使用JSON时丢弃了元数据。适合用脚本语言来解析。

支持的传输协议有:

TFileTransport – 该传输协议会写文件。

TFramedTransport – 当使用一个非阻塞服务器时,要求使用这个传输协议。它按帧来发送数据,其中每一帧的开头是长度信息。

TMemoryTransport – 使用存储器映射输入输出。(Java的实现使用了一个简单的ByteArrayOutputStream)

TSocket – 使用阻塞的套接字I/O来传输。

TZlibTransport – 用zlib执行压缩。用于连接另一个传输协议。

Thrift还提供众多的服务器,包括:

TNonblockingServer – 一个多线程服务器,它使用非阻塞I/O(Java的实现使用了NIO通道)。TFramedTransport必须跟这个服务器配套使用。

TSimpleServer – 一个单线程服务器,它使用标准的阻塞I/O。测试时很有用。

TThreadPoolServer – 一个多线程服务器,它使用标准的阻塞I/O。

参见

自由软件主题

数据序列化格式比较

Apache Avro

ASN.1(抽象语法标记一)

Caucho的Hessian

谷歌的Protocol Buffers

外部数据表示法

ZeroC的ICE

SDXF(结构化数据交换格式)

主要功能

Thrift的架构包括了其他几种通讯协议和传输方式,以及服务器类型,这些在原有百科中未提及。例如,Thrift支持的通讯协议还包括TJSONProtocol,它使用JSON进行数据编码,以及TSimpleJSONProtocol,一个只写协议,不能被Thrift解析,因为它使用JSON丢弃元数据,适合脚本语言解析。在传输方式方面,Thrift还支持TMemoryTransport,使用内存进行I/O,Java实现内部使用简单的ByteArrayOutputStream,以及TZlibTransport,使用zlib进行压缩,与另一个传输方式一起使用。在服务器类型方面,Thrift还提供了TThreadedServer,使用每个连接模型一个线程的多线程服务器和标准阻塞I/O。

此外,Thrift的优点还包括语言绑定感觉自然,例如Java使用ArrayList\u003cString\u003e,C++使用std::vector\u003cstd::string\u003e,以及应用级别的传输格式和序列化级别的传输格式被清晰地分开,它们可以独立修改。同时,Thrift也可以作为跨语言文件序列化的工具。

最后,Thrift的协议支持软版本控制,不需要像主版本/次版本那样的集中和明确的机制。松散耦合的团队可以自由地演化RPC调用,没有构建依赖或非标准软件,也没有不兼容软件许可证的混合。

软件优点

Thrift一些已经明确的优点包括:

跟一些替代选择,比如SOAP相比,跨语言序列化的代价更低,因为它使用二进制格式。

它有一个又瘦又干净的库,没有编码框架,没有XML配置文件。

绑定感觉很自然。例如,Java使用java.util.ArrayList\u003cString\u003e;C++使用std::vector\u003cstd::string\u003e。

应用层通讯格式与序列化层通讯格式是完全分离的。它们都可以独立修改。

预定义的序列化格式包括:二进制格式、对HTTP友好的格式,以及紧凑的二进制格式。

兼作跨语言文件序列化。

协议使用软版本号机制软件版本管理。Thrift不要求一个中心化的和显式的版本号机制,例如主版本号/次版本号。松耦合的团队可以轻松地控制RPC调用的演进。

没有构建依赖也不含非标准化的软件。不存在不兼容的软件许可证混用的情况。

参考资料

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}
友情链接: