thrift 应用以及一些已知的问题

标签: 测试工具 | 发表时间:2012-05-03 12:41 | 作者:xinyu
出处:http://qa.taobao.com

thrift 是由facebook贡献,目前由apache在推进的一个开源项目。它主要是作为一个可靠的RPC 框架来使用,当然它也包含了序列化与反序列化的功能。对比其他的具备类似功能的开源工具,thrift在语言支持、性能、可靠性、易用性上具有相当的优势。

1. 语言支持
C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml等,十分方便在不同的语言或组件之间交互和协作。

2. IDL 描述
thrift依靠 IDL 来描述提供的服务和接口。IDL 例子如下
namespace cpp shared
namespace java shared
namespace perl shared
struct JobInfo {
1: i32 jobId
2: string jobName
3: string jobDescription
4: string executor
}

service SharedService {
i32 exeucte(1: JobInfo job)
}
thrift通过编译IDL文件,为不同的语言生成对应的client以及server端代码模板。以生成c++代码为例
thrift --gen cpp job.thrift

依赖IDL的一个不足之处,就是在实现应用时,必须预先知道要提供的服务的接口细节。一旦确定了thrift IDL描述并编码成代码之后,就无法在运行期动态的改变服务接口了。这对于大型系统来说,会有一定的限制。在这个问题上apache avro提供了一个新的思路。有兴趣的同学可以研究一下apache avro的generic 方式动态加载schema的机制

3. 性能
作为一个RPC框架,其性能方面主要是比拼序列化和反序列化两个方面。这方面的对手当然是google protobuf了。(实际上还有avro,这里偷个懒)

序列化的性能对比(ms)

反序列化的性能对比(ms)


从这个数据上来看,thrift要比protobuf 快近1倍。

4. 可靠性
不详述

5. 在windows上使用 thrift 的一些问题
thrift在开发过程可以说是完全没有照顾windows的打算,一直到目前最新的0.8.0版本,根据IDL生成的代码都是无法在windows上编译运行的。甚至thrift 本身的lib库代码在windows上都是无法正常运作的。需要解决一下几个问题

  • 初始化windows socket library
  • socket server在listen之前需要先bind。需要修改TServerSocket.cpp的listen函数

解决以上问题后能保证thrift client正常运作。

  • socket的flag需要修改为0,windows不支持AI_PASSIVE | AI_ADDRCONFIG
  • socket的协议族要修改为PF_INET

解决了以上问题之后,能保证thrift server在win7上正常运作。若需要thrift 在windows XP也能正常运行,还需要修改

  • 编译thrift时,强制指定WINVER=0×501
  • 在listen函数中增加如下代码

#if WINVER<=0x502
// on WINDOWS XP platform, after poll(actually select) operation,
// the revents field will not be set
fds[0].revents = POLLIN;
#endif

  • 建立socket server时,必须指定acceptTimeout,至少为100ms。如果使用默认值,会导致应用进入死循环,占用全部CPU

相关 [thrift 应用 问题] 推荐:

thrift 应用以及一些已知的问题

- - Taobao QA Team
thrift 是由facebook贡献,目前由apache在推进的一个开源项目. 它主要是作为一个可靠的RPC 框架来使用,当然它也包含了序列化与反序列化的功能. 对比其他的具备类似功能的开源工具,thrift在语言支持、性能、可靠性、易用性上具有相当的优势. C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml等,十分方便在不同的语言或组件之间交互和协作.

【Thrift二】Thrift版的Hello World

- - 开源软件 - ITeye博客
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错.

【Thrift一】Thrift编译安装

- - 开源软件 - ITeye博客
上面这段话选自Apache对Thrift的一句话介绍,Thrift是一个高性能的RPC服务框架. 在技术选型时,有如下三方面的需求时,考虑使用Thrift. 2.请求和响应的数据传输量大. 个人认为在没有特别strong的理由情况下,慎用Thrift. HTTP请求通常都能够满足需求,使用Thrift带来很多开发上的额外的工作量,一个简单的服务,就要写客户端代码,.thrift接口定义以及服务器端的服务响应代码,简单的事情复杂化.

Thrift入门试用

- - Java - 编程语言 - ITeye博客
在新的项目中公司在平台内部系统间使用Thrift通讯,都没有听说过. 然后听同事说,是跨语言Socket通讯的开源组件. 1.跨平台和语言的Socket通讯组件. 2.根据伪代码的结构语言定义对象和服务结构,然后生成各语言的代码和接口. 3.各语言根据组件提供的库,编写客户端和服务器端程序. 服务器端实现接口并编写业务逻辑.

thrift快速入门实例

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. Thrift是Facebook的核心框架之一,使不同的开发语言开发的系统可以通过该框架实现彼此的通信,类似于webservice,但是Thrift提供了近乎变态的效率和开发的方便性,是webservice所不能比拟的.  * @author 54chen(陈臻) [[email protected] [email protected]] .

Thrift原理简析(JAVA)

- - ITeye博客
    本文以UserService为例,描述一下使用thrift的方式,以及其原理...     首先下载和安装thrift客户端,比如在windows平台下,下载thrift.exe,不过此处需要提醒,不同的thrift客户端版本生成的API可能不兼容.本例使用thrift-0.9.0.exe;通过"--gen"指定生成API所适配的语言.本实例为生成java客户端API..

Apache Thrift - java开发详解

- - 编程语言 - ITeye博客
2、编写IDL文件 Hello.thrift. 4、编写实现类、实现Hello.Iface:. 5、编写服务端,发布(阻塞式IO + 多线程处理)服务.      * 阻塞式、多线程处理 .             //设置传输通道,普通通道  .             //使用高密度二进制协议  .

Apache Thrift入门1-架构&介绍

- 彦强 - J2EE企业应用 顾问/咨询- H.E.&#39;s Blog
  Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性. 所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.

thrift最佳实践:版本与兼容

- 铭文 - 五四陈科学院-坚信科学,分享技术
以下内容由[五四陈科学院]提供. 在许多系统里面,被称做message.. 协议随着岁月而演变,如果一个已经存在的消息类型不再满足需求,但是你仍然想使用原来使用thrift文件生成的代码,比如你想在现在的消息类型上增加一个额外的字段. 不用担心人,不搞坏原来的任何代码而更新消息类型,是非常简单的,只需要时刻记录以下的规则:.

浅谈Thrift内部实现原理

- - 董的博客
Dong | 新浪微博: 西成懂 | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及 版权声明. 网址: http://dongxicheng.org/search-engine/thrift-internals/. Thrift由两部分组成:编译器(在compiler目录下,采用C++编写)和服务器(在lib目录下),其中编译器的作用是将用户定义的thrift文件编译生成对应语言的代码,而服务器是事先已经实现好的、可供用户直接使用的RPC Server(当然,用户也很容易编写自己的server).