thrift

2007年facebook開發的協議

Thrift是一種介面描述語言和二進位通訊協議,它被用來定義和創建跨語言的服務。它被當作一個遠程過程調用(RPC)框架來使用,是由Facebook為“大規模跨語言服務開發”而開發的。

簡介


Thrift通過一個代碼生成引擎聯合了一個軟體棧,來創建不同程度的、無縫的跨平台高效服務,可以使用C#、C++(基於POSIX兼容系統)、Cappuccino、CocoaDelphiErlangGoHaskellJavaNode.js、OCamlPerlPHPPythonRuby和Smalltalk。雖然它以前是由Facebook開發的,但它現在是Apache軟體基金會的開源項目了。該實現被描述在2007年4月的一篇由Facebook發表的技術論文中,該論文現由Apache掌管。
thrift允許定義一個簡單的定義文件中的數據類型和服務介面,以作為輸入文件,編譯器生成代碼用來方便地生成RPC客戶端和伺服器通信的無縫跨編程語言

發展歷程


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。

優點


Thrift一些已經明確的優點包括:
● 跟一些替代選擇,比如SOAP相比,跨語言序列化的代價更低,因為它使用二進位格式。
● 它有一個又瘦又乾淨的庫,沒有編碼框架,沒有XML配置文件。
● 綁定感覺很自然。例如,Java使用java.util.ArrayList;C++使用std::vector
● 應用層通訊格式與序列化層通訊格式是完全分離的。它們都可以獨立修改。
● 預定義的序列化格式包括:二進位格式、對HTTP友好的格式,以及緊湊的二進位格式。
● 兼作跨語言文件序列化。
● 協議使用軟版本號機制軟體版本管理。Thrift不要求一個中心化的和顯式的版本號機制,例如主版本號/次版本號。松耦合的團隊可以輕鬆地控制RPC調用的演進。
● 沒有構建依賴也不含非標準化的軟體。不存在不兼容的軟體許可證混用的情況。

創建服務


Thrift由C++編寫,但可以為眾多語言創建代碼。要創建一個Thrift服務,必須寫一些Thrift文件來描述它,為目標語言生成代碼,並且寫一些代碼來啟動伺服器及從客戶端調用它。
Thrift將由這個描述信息生成獨立的代碼。例如,在Java里,PhoneType將是Phone類中一個簡單的enum

參見


自由軟體主題
● 數據序列化格式比較
● Apache Avro
● ASN.1(抽象語法標記一)
● Caucho的Hessian
Google的Protocol Buffers
● 外部數據表示法
● ZeroC的ICE
● SDXF(結構化數據交換格式