thrift 应用以及一些已知的问题
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