thrift 是由facebook貢獻(xiàn),目前由apache在推進(jìn)的一個(gè)開(kāi)源項(xiàng)目。它主要是作為一個(gè)可靠的RPC 框架來(lái)使用,當(dāng)然它也包含了序列化與反序列化的功能。對(duì)比其他的具備類(lèi)似功能的開(kāi)源工具,thrift在語(yǔ)言支持、性能、可靠性、易用性上具有相當(dāng)?shù)膬?yōu)勢(shì)。
1. 語(yǔ)言支持
C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml等,十分方便在不同的語(yǔ)言或組件之間交互和協(xié)作。
2. IDL 描述
thrift依靠 IDL 來(lái)描述提供的服務(wù)和接口。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通過(guò)編譯IDL文件,為不同的語(yǔ)言生成對(duì)應(yīng)的client以及server端代碼模板。以生成c++代碼為例
thrift --gen cpp job.thrift
service SharedService {
i32 exeucte(1: JobInfo job)
}
依賴(lài)IDL的一個(gè)不足之處,就是在實(shí)現(xiàn)應(yīng)用時(shí),必須預(yù)先知道要提供的服務(wù)的接口細(xì)節(jié)。一旦確定了thrift IDL描述并編碼成代碼之后,就無(wú)法在運(yùn)行期動(dòng)態(tài)的改變服務(wù)接口了。這對(duì)于大型系統(tǒng)來(lái)說(shuō),會(huì)有一定的限制。在這個(gè)問(wèn)題上apache avro提供了一個(gè)新的思路。有興趣的同學(xué)可以研究一下apache avro的generic 方式動(dòng)態(tài)加載schema的機(jī)制
3. 性能
作為一個(gè)RPC框架,其性能方面主要是比拼序列化和反序列化兩個(gè)方面。這方面的對(duì)手當(dāng)然是google protobuf了。(實(shí)際上還有avro,這里偷個(gè)懶)
序列化的性能對(duì)比(ms)
反序列化的性能對(duì)比(ms)
從這個(gè)數(shù)據(jù)上來(lái)看,thrift要比protobuf 快近1倍。
4. 可靠性
不詳述
5. 在windows上使用 thrift 的一些問(wèn)題
thrift在開(kāi)發(fā)過(guò)程可以說(shuō)是完全沒(méi)有照顧windows的打算,一直到目前最新的0.8.0版本,根據(jù)IDL生成的代碼都是無(wú)法在windows上編譯運(yùn)行的。甚至thrift 本身的lib庫(kù)代碼在windows上都是無(wú)法正常運(yùn)作的。需要解決一下幾個(gè)問(wèn)題
解決以上問(wèn)題后能保證thrift client正常運(yùn)作。
解決了以上問(wèn)題之后,能保證thrift server在win7上正常運(yùn)作。若需要thrift 在windows XP也能正常運(yùn)行,還需要修改
#if WINVER<=0x502
// on WINDOWS XP platform, after poll(actually select) operation,
// the revents field will not be set
fds[0].revents = POLLIN;
#endif
Copyright@ 2011-2016 版權(quán)所有:大連千億科技有限公司 遼ICP備11013762-3號(hào) google網(wǎng)站地圖 百度網(wǎng)站地圖 網(wǎng)站地圖
公司地址:大連市沙河口區(qū)中山路692號(hào)辰熙星海國(guó)際2317 客服電話(huà):0411-39943997 QQ:2088827823 37482752
法律聲明:未經(jīng)許可,任何模仿本站模板、轉(zhuǎn)載本站內(nèi)容等行為者,本站保留追究其法律責(zé)任的權(quán)利! 隱私權(quán)政策聲明