什麼是Thrift

起源

  • 百度百科怎麼說
   thrift是一個軟件框架,用來進行可擴展且跨語言的服務的開發。

它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。 thrift最初由facebook開發,07年四月開放源代碼,08年5月進入apache孵化器。php

thrift贊成你定義一個簡單的定義文件裏的數據類型和服務接口。以做爲輸入文件,編譯器生成代碼用來方便地生成RPCclient和server通訊的無縫跨編程語言。python

  • 互動百科的觀點
   Thrift是Facebook的核心技術框架之中的一個,使不一樣語言開發的系統可以經過該框架進行通訊。開發人員使用thrift提供的格式來定義數據和服務腳本。

thrift可以經過定義的腳本本身主動生成不一樣語言的代 碼以支持不一樣語言之間的通訊。thrift支持多種數據通訊協議,比方xml,jason,binnary等等。 Thrift並不是惟一的跨語言通訊框架。像google的protocol buffers也是與之相似的框架。apache

關於二者以前的比較可以去google一下。編程

  • 個人總結
   Thrift源於大名鼎鼎的facebook之手,在2007年facebook提交Apache基金會將Thrift做爲一個開源項目,對於當時的 facebook來講創造thrift是爲了解決facebook系統中各系統間大數據量的傳輸
通訊以及系統之間語言環境不一樣需要跨平臺的特性。因此thrift可以支持多種程序語言,好比: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk. 在多種不
同的語言之間通訊thrift可以做爲二進制的高性能的通信中間件。支持數據(對象)序列化和多種類型的RPC服務。

特性

  • 框架
  • 開源項目
  • 通信中間件
  • 跨語言
  • RPC服務(Remote Procedure Call Protocol——遠程過程調用協議)
  • IDL工具(Interface Description Language——接口描寫敘述語言)
  • 高併發
  • TCompactProtocol協議

基礎架構

  1. Thrift適用於程序對程 序靜態的數據交換,需要先肯定好他的數據結構,他是全然靜態化的,當數據結構發生變化時,必須又一次編輯IDL文件,代碼生成,再編譯加載的流程,跟其它 IDL工具相比較可以視爲是Thrift的弱項,Thrift適用於搭建大型數據交換及存儲的通用工具,對於大型系統中的內部傳輸數據相對於JSON和 xml無論在性能、傳輸大小上有明顯的優點。
  2. Thrift是IDL(interface definition language)描寫敘述性語言的一個詳細實現,關於IDL的話題咱們可以追溯到CORBA盛行1999-2001年(Common Object Request Broker Architecture/公用對象請求代理體系結構),在 IDL 中咱們彷佛不會忘記到這幾個keyword:module、interface、string、long 和 int,我還記得IDL利用module來建立名稱空間。並且準確地映射爲 Java 的 package。這些特性差點兒和現在thrift的特性全然一樣,因此thrift的設計思想和理念毫不是什麼從火星來的new idea,看看在那個CORBA盛行的年代人們提出的概念。如圖所看到的CORBA 請求的各個部分。回頭咱們再與thrift進行對照一下:Thrift基礎架構.gif
  3. Thrift是一個服務端和client的架構體系。從我我的的感官上來看Thrift是一個相似XML-RPC+Java-to- IDL+Serialization Tools=Thrift 的東東。Thrift 具備本身內部定義的傳輸協議規範(TProtocol)和數據傳輸標準(TTransports)。經過IDL腳本對數據傳輸的數據結構(struct) 和數據傳輸的業務邏輯(service)依據不一樣的執行環境高速的構建對應的代碼,並且經過本身內部的序列化機制對傳輸的數據進行簡化和壓縮提升高併發、 大型系統中數據交互的成本,下圖描繪了Thrift的整體架構。分爲6個部分:1.你的業務邏輯實現(You Code) 2.client和服務端相應的Service 3.運行讀寫操做的計算結果4.TProtocol 5.TTransports 6.底層I/O通訊。

    Apache-Thrift-Architecture.png

說明:圖中前面3個部分是1.你經過Thrift腳本文件生成的代碼,2.圖中的褐色框部分是你依據生成代碼構建的client和處理器的代碼,3.圖中紅色的部分是2 端產生的計算結果。json

從TProtocol如下3個部分是Thrift的傳輸體系和傳輸協議以及底層I/O通訊,Thrift並且提供 阻塞、非阻塞,單線程、多線程的模式執行在server上,還可以配合server/容器一塊兒執行,可以和現有JEEserver/Web容器無縫的結合。後端

數據類型

  • Base Types:基本類型
  • Struct:結構體類型
  • Container:容器類型,即List、Set、Map
  • Exception:異常類型
  • Service: 定義對象的接口,和一系列方法

協議

Thrift可以讓你選擇client與服務端之間傳輸通訊協議的類別,在傳輸協議上總體上劃分爲文本(text)和二進制(binary)傳輸協議, 爲節約帶寬,提供傳輸效率,普通狀況下使用二進制類型的傳輸協議爲多數,但有時會仍是會使用基於文本類型的協議,這需要依據項目/產品中的實際需求:api

  • TBinaryProtocol – 二進制編碼格式進行傳輸數據。
  • TCompactProtocol – 這樣的協議頗有效的。使用Variable-Length Quantity (VLQ) 編碼對數據進行壓縮。
  • TJSONProtocol – 使用JSON的數據編碼協議進行傳輸數據。
  • TSimpleJSONProtocol – 這樣的節約僅僅提供JSON僅僅寫的協議,適用於經過腳本語言解析
  • TDebugProtocol – 在開發的過程當中幫助開發者調試用的,以文本的形式展示方便閱讀。

傳輸層

  • TSocket- 使用阻塞式I/O進行傳輸,也是最多見的模式。
  • TFramedTransport- 使用非阻塞方式,按塊的大小。進行傳輸,相似於Java中的NIO。

  • TFileTransport- 顧名思義依照文件的方式進程傳輸,儘管這樣的方式不提供Java的實現。但是實現起來很easy。
  • TMemoryTransport- 使用內存I/O。就比如Java中的ByteArrayOutputStream實現。
  • TZlibTransport- 使用運行zlib壓縮,不提供Java的實現。

服務端類型

  • TSimpleServer - 單線程server端使用標準的阻塞式I/O。
  • TThreadPoolServer - 多線程server端使用標準的阻塞式I/O。

  • TNonblockingServer – 多線程server端使用非阻塞式I/O,並且實現了Java中的NIO通道。

貨比三家

Thrift與其它傳輸方式的比較 網絡

  1. xml與JSON相比。體積太大。但是xml傳統。也不算複雜。
  2. json體積較小,新穎。但不夠無缺。
  3. thrift體積超小,使用起來比較麻煩,不如前二者輕便。但是對於1.高併發、2.傳輸數據量大、3.多語言環境, 知足當中2點使用 thrift仍是值得的。

假定需要傳輸一樣的內容。但使用不一樣的方式從一、傳輸內容所產生的大小 二、傳輸過程當中服務端和client所產生的開銷,這2個方便進行比較。使用Thrift和其它方式的所產生的內容大小比較結果例如如下:Thrift-size.png數據結構

在上圖中咱們能明顯看出,最臃腫的是RMI,其次是xml,使用Thrift的TCompactProtocol協議和Google 的 Protocol Buffers 相差的不算太多,相比而言仍是Google 的 Protocol Buffers效果最佳。多線程

Thrift-load.png

誰在用

Quora.gif

Thrift用於Quara系統後端數據的通訊,服務端是用C++來實現的。client則是python。
Quara背景:Quara是在線問答服務公司,相似新浪微博和百度知道的合體。消息靈通人士透露,去年Quara得到了1400萬美圓投資。眼下他們僅僅有9名員工。
原文:http://www.philwhln.com/quoras-technology-examined#thrift

Evernote-logo.gif.png

Thrift用於在多種Evernote API平臺開發的client與Evernoteserver之間的通訊與傳輸數據,Evernote API定義了本身的Evernote Data Access and Management (EDAM) 協議規範,讓client使用更小的網絡帶寬上傳、下載文件和在線即時搜索服務。
Evernote 背景:EverNote是一款很著名的免費軟件,它最大的特色就是支持多平臺,而且數據能經過網絡互一樣步。譬如說,你可以隨時在手機上的Evernote新增筆記,回家後在電腦上也能看到它了。
原文:http://www.evernote.com/about/developer/api/evernote-api.htm
HBase 中的Thrift
Thrift用於HBase中是爲了提供跨平臺的服務接口,在HBase 中可以使用[hbase-root]/bin/hbase thrift start 命令啓動涵蓋Thrift的HBase服務端。client經過thrift的命令生成不一樣版本號的client代碼,依據定義的數據格式。對遠程HBase服務端進行 操做。是除了REST遠程方法調用的還有一種途徑。
參見:http://wiki.apache.org/hadoop/Hbase/ThriftApi

調研結論

  1. 高併發
  2. 傳輸數據量大
  3. 多語言環境 
相關文章
相關標籤/搜索