Thrift是爲了解決facebook系統中各系統之間大數據量的傳輸通信以及系統之間語言環境不一樣須要跨平臺這一特性而創造的。因此thrift能夠支持多種程序語言,例如: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不一樣的語言之間通訊thrift能夠做爲二進制的高性能的通信中間件,支持數據(對象)序列化和多種類型的RPC服務。 服務器
Thrift適用於程序對程序靜態的數據交換,須要先肯定好他的數據結構,他是徹底靜態化的,當數據結構發生變化時,必須從新編輯IDL文件、代碼生成、再編譯載入的流程,跟其餘IDL(接口描述語言,Interface Definition Language)工具相比較能夠視爲是Thrift的弱項。 數據結構
Thrift適用於搭建大型數據交換及存儲的通用工具,對於大型系統中的內部數據傳輸相對於JSON和xml不管在性能、傳輸大小上有明顯的優點。 多線程
Thrift 基礎架構
Thrift是一個服務端和客戶端的架構體系,從我我的的感官上來看Thrift是一個相似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的東東,Thrift 具備本身內部定義的傳輸協議規範(TProtocol)和傳輸數據標準(TTransports),經過IDL腳本對傳輸數據的數據結構(struct) 和傳輸數據的業務邏輯(service)根據不一樣的運行環境快速的構建相應的代碼,而且經過本身內部的序列化機制對傳輸的數據進行簡化和壓縮提升高併發、 大型系統中數據交互的成本,下圖描繪了Thrift的總體架構,分爲6個部分:1.你的業務邏輯實現(You Code黃色部分)
2.客戶端和服務端對應的Service (褐色部分)
3.執行讀寫操做的計算結果(紅色部分)
4.TProtocol (紫色部分)
5.TTransports (藍色部分)
6.底層I/O通訊(灰色部分)
架構
圖中前面3個部分是:1.圖中的黃色部分是你經過Thrift腳本文件生成的代碼;2.圖中的褐色框部分是你根據生成代碼構建的客戶端和處理器的代碼;3.圖中紅色的部分是2 端產生的計算結果。 併發
從TProtocol日後開始的3個部分是Thrift的傳輸體系和傳輸協議以及底層I/O通訊。Thrift而且提供 堵塞、非阻塞,單線程、多線程的模式運行在服務器上,還能夠配合服務器/容器一塊兒運行,能夠和現有JEE服務器/Web容器無縫的結合。 高併發
數據類型
* Base Types:基本類型
* Struct:結構體類型
* Container:容器類型,即List、Set、Map
* Exception:異常類型
* Service: 定義對象的接口,和一系列方法 工具
協議
Thrift可讓你選擇客戶端與服務端之間傳輸通訊協議的類別,在傳輸協議上整體上劃分爲文本(text)和二進制(binary)傳輸協議, 爲節約帶寬,提供傳輸效率,通常狀況下使用二進制類型的傳輸協議爲多數,但有時會仍是會使用基於文本類型的協議,這須要根據項目/產品中的實際需求:
* TBinaryProtocol – 二進制編碼格式進行數據傳輸。
* TCompactProtocol – 這種協議很是有效的,使用Variable-Length Quantity (VLQ) 編碼對數據進行壓縮。
* TJSONProtocol – 使用JSON的數據編碼協議進行數據傳輸。
* TSimpleJSONProtocol – 這種節約只提供JSON只寫的協議,適用於經過腳本語言解析
* TDebugProtocol – 在開發的過程當中幫助開發人員調試用的,以文本的形式展示方便閱讀。 性能
傳輸層
* TSocket- 使用堵塞式I/O進行傳輸,也是最多見的模式。
* TFramedTransport- 使用非阻塞方式,按塊的大小,進行傳輸,相似於Java中的NIO。
* TFileTransport- 顧名思義按照文件的方式進程傳輸,雖然這種方式不提供Java的實現,可是實現起來很是簡單。
* TMemoryTransport- 使用內存I/O,就比如Java中的ByteArrayOutputStream實現。
* TZlibTransport- 使用執行zlib壓縮,不提供Java的實現。 大數據
服務端類型
* TSimpleServer - 單線程服務器端使用標準的堵塞式I/O。
* TThreadPoolServer - 多線程服務器端使用標準的堵塞式I/O。
* TNonblockingServer – 多線程服務器端使用非堵塞式I/O,而且實現了Java中的NIO通道。 編碼