酷勤网 – 程序员的那点事!

当前位置:首页 > 编程 > 开源风暴 > 正文

开源项目thrift 应用以及一些已知的问题

浏览次数: 2012年05月07日 Taobao QA Team 字号:

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
}

thrift通过编译IDL文件,为不同的语言生成对应的client以及server端代码模板。以生成c++代码为例
thrift --gen cpp job.thrift

service SharedService {
i32 exeucte(1: JobInfo job)
}

依赖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
本文来源:原文链接

无觅相关文章插件,快速提升流量