1. 基本名詞
? ? ?Types: 為了滿足多語言平臺的要求,需要提供基本數(shù)據(jù)類型來進(jìn)行轉(zhuǎn)換。比如在C++的Map和Python的Dict之間能夠相互轉(zhuǎn)換。
? ? ?Transport: 對于每一種語言,都應(yīng)該有一個抽象的公共層來完成對應(yīng)的雙向數(shù)據(jù)傳輸。
? ? ?Protocal: 數(shù)據(jù)需要有一種方式來使用對應(yīng)的傳輸層的code,而不用關(guān)心傳輸層的具體實現(xiàn)細(xì)節(jié)。
? ? ?Versioning:數(shù)據(jù)需要有自己的版本號來實現(xiàn)對應(yīng)的健壯性。
? ? ?Processing : 產(chǎn)生code來完成RPC調(diào)用。
2. 類型
? ? 1. Goals:?
? ? ? ? ?1. 使用最基本的數(shù)據(jù)類型,不管上層使用怎么樣的編程語言。
? ? ? ? ?2. 不使用動態(tài)數(shù)據(jù)類型,也不需要開發(fā)者寫對象序列化或者傳輸?shù)拇a(已經(jīng)封裝)。
? ? ? ? ?3. IDL 用來告訴代碼生成器如何在多語言之上安全地傳輸數(shù)據(jù)。
? ? 2. Base Types:
? ? ? ? ?1. 選取了大多數(shù)語言中都存在的基本數(shù)據(jù)類型,忽略了一些語言中特別的類型。(無符號類型), 所有的基本
? ? ? ? ? ? 類型都是有符號的。
? ? ? ? ?2. 基本類型包括bool, byte,i16,i32,i64,double,string。
? ? 3. Structs:
? ? ? ? ? 1. ? 提供了一種common的對象來代表面向?qū)ο笳Z言中的對象類型,每一個filed都有一個標(biāo)志符。
? ? ? ? ? 2. ? 每個filed必須有一個標(biāo)志符和一個給定的默認(rèn)值。標(biāo)志符如果沒有給定的話,會自動分配一個,但是強(qiáng)烈建議給定標(biāo)志符,為了方便版本控制。
? ? ?4. Container:
? ? ? ? ? 1. ?List, set, Map。其中List被翻譯成STL中的vector, 或者Java中的ArrayList,set和map類似。
? ? ? ? ? 2. ?要求對應(yīng)的基本語言類型支持對應(yīng)的Thrift的基本數(shù)據(jù)類型。
? ? ? ? ? 3. ?在每一種目標(biāo)語言中,對于每一種定義的類型,生成兩個接口,read和write,用于序列化和傳輸對應(yīng)的數(shù)據(jù)結(jié)構(gòu)。
? ? ?5. Exceptions:
? ? ? ? ? 1. 使用Exception關(guān)鍵字來代替對應(yīng)的structs關(guān)鍵字,得到對應(yīng)的基本類。
? ? ? ? ? 2. 生成的對象繼承自每一種語言中的對應(yīng)的Exception的基類。
? ? ?6. Services:
? ? ? ? ? ?1. 提供了服務(wù)端的接口調(diào)用,通過代碼生成器會生成Client端和Server端的樁函數(shù)接口,共上層調(diào)用使用。
? ? ? ? ? ?2. 在每一個函數(shù)前面可以加上async關(guān)鍵字,這個關(guān)鍵字能夠?qū)崿F(xiàn)對應(yīng)的一部方法。
? ? ? ? ? ?3. 一個純void函數(shù)也會返回一個response,用來保證該操作在服務(wù)端已經(jīng)被執(zhí)行。
? ? ? ? ? ?4. async call只保證消息在傳輸層是沒有問題的,因此,在使用async的時候需要保證當(dāng)前的使用環(huán)境對于丟包是可以接受的。
3. Transport
? ? ? 1. 接口
? ? ? ? ? ? 1. 傳輸層用來促進(jìn)數(shù)據(jù)傳輸。一個關(guān)鍵的設(shè)計是Thrift將數(shù)據(jù)傳輸層和代碼生成器分開。
? ? ? ? ? ? 2. 由于抽象的IO炒作產(chǎn)生的tradoff相比起實際的IO操作顯得微不足道。
? ? ? ? ? ? 3. 需要滿足的基本功能:如何讀寫數(shù)據(jù),不管是在網(wǎng)絡(luò)中,還是共享內(nèi)存,還是從磁盤文件中讀寫。
? ? ? ? ? ? 4. 提供的接口如下:open, close,isOpen, read, write, flush。還有一些用于batch操作的接口
? ? ? ? ? ? 5. 對于TServerTransport,還有接口用來創(chuàng)建對應(yīng)的Transport對象。如open, listen, accept, close。
? ? ? ?2. 實現(xiàn)
? ? ? ? ? ? 1. TSocket 類對于TCP/IP的流式套接字實現(xiàn)了一個通用,簡單的接口。
? ? ? ? ? ? 2. TFileTransport類實現(xiàn)了一個抽象接口,用于將磁盤文件導(dǎo)入到數(shù)據(jù)流中。
? ? ? ?3. Utilities
? ? ? ? ? ? 1. 網(wǎng)絡(luò)傳輸層設(shè)計的支持簡單的擴(kuò)展,比如組合,TBufferdTransport實現(xiàn)在傳輸層實現(xiàn)了buffer的功能,TFrameTransport實現(xiàn)了數(shù)據(jù)頭定長大小,用于Noblocking傳輸。TMemoryBuffer允許讀和寫直接在進(jìn)程的堆頂完成。
4. Protocal
? ? ? ? ?1. 接口
? ? ? ? ? ? ? ?1. 另外一塊主要的部分是thrift中將數(shù)據(jù)結(jié)構(gòu)和傳輸層分離,thrift定義了一些傳輸時的基本類型,但是沒有強(qiáng)制定義需要實現(xiàn)的編碼格式,只要能被代碼生成器識別就好。
? ? ? ? ? ? ? ? 2. ?thrift協(xié)議的接口簡單明了,支持兩種功能:雙向有序的消息,基本類型,容器,結(jié)構(gòu)的編碼。
? ? ? ? ?2. 結(jié)構(gòu)
? ? ? ? ? ? ? ? 1. Thrift中默認(rèn)使用流式結(jié)構(gòu)來傳輸對應(yīng)的協(xié)議,這樣避免了因為需要分片或者在發(fā)送前整體計算帶來的性能損失。當(dāng)有的場景需要使用分片,或者分片的性能優(yōu)勢更加明顯的時候,可以使用TFramedTransport這個抽象接口類。
? ? ? ? ?3. 實現(xiàn)
? ? ? ? ? ? ? ? ?1. Thrift的實現(xiàn)了一個空間高效的二進(jìn)制協(xié)議,所有的數(shù)據(jù)都以一個扁平的二進(jìn)制格式存在,整形被轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序,字符串在頭上加上它的長度,所有的消息和field 頭都用它的整數(shù)序列號,忽略這些filed中的字符串名字。
? ? ? ? ? ? ? ? ?2. 我們沒有做過多的性能優(yōu)化,為了代碼的整潔和高效。如果有需要,可以加入這些優(yōu)化方案。
5.Versioning
? ? ? ?1. 域標(biāo)志符
? ? ? ? ? ? 1. Thrift在版本控制上面是健壯的,它可以接受舊客戶端過來的請求并正確處理。
? ? ? ? ? ? 2. Thrift中的版本控制是通過域標(biāo)志符來確定的,thrift結(jié)構(gòu)中的每一項前面都有一個對應(yīng)的標(biāo)志符,標(biāo)志符和數(shù)據(jù)類型唯一化開item。
? ? ? ? ? ? 3. 為了避免沖突,自動分配的標(biāo)志符從-1開始遞減,人工定義的標(biāo)志符只能為整數(shù)。
? ? ? ? ? ? 4. 在數(shù)據(jù)是自定義的前提下,當(dāng)反序列化的時候,thrift的code 生成器可以根據(jù)標(biāo)識符來判斷讀取到的數(shù)據(jù)是否對齊,也可以跳過不能識別的域,保證兼容性。
? ? ? ? ? ? 5. 域標(biāo)志符也可以在參數(shù)列表中聲。
? ? ? ?2. Isset
? ? ? ? ? ? ?1. 用來標(biāo)注必須存在于結(jié)構(gòu)體中的域,如果必須存在,標(biāo)注為true,這樣可以當(dāng)該域不存在的時候,可以通知上層調(diào)用者。
? ? ? ? 3. 場景分析
? ? ? ? ? ? ? 1. 4種場景,加減域/新舊client或者server。
? ? ? ? ?4. Protocal/Transport Versioning
? ? ? ? ? ? ? ?1. 實現(xiàn)了TProtocal的抽象接口,用來讓協(xié)議的實現(xiàn)自己來管理版本。
6. RPC 實現(xiàn)
? ? ? ? 1. TProcessor
? ? ? ? ? ? ? ? 1. 核心類,抽象出client和server的基類,核心功能是處理input和output。
? ? ? ? 2. Generated code
? ? ? ? ? ? ? ? ?2. 自動生成client端和server端的調(diào)用接口。
? ? ? ? 3. TServer
? ? ? ? ? ? ? ? ?1. Tserver 可以有多種實現(xiàn),來滿足不同的需求。如單線程的TSimpleServer, 每個連接一個線程的TThreadedServer, 還有基于線程庫的TThreadPoolServer.
? ? ? ? ? ? ? ? ?2. 開發(fā)者可以實現(xiàn)自己的TServer。
7. 實現(xiàn)細(xì)節(jié)
? ? ? ? ?1. 目標(biāo)語言
? ? ? ? ? ? ? ? 1. C++, Java, Python, Ruby, PHP
? ? ? ? ? ? ? ? 2. 盡可能簡單的抽象,保留在每一種語言中可以自主開發(fā)的空間。
? ? ? ? ?2. 生成的結(jié)構(gòu)體
? ? ? ? ?3. RPC 方法定義
? ? ? ? ? ? ? ? 1. RPC call中的方法用string去實現(xiàn),用一些手段將字符處理的代價盡可能的減少,同時方便編程實現(xiàn)。
? ? ? ? ?4. 服務(wù)器和多線程
? ? ? ? ? ? ? ? 1. 因為種種原因,沒有采用boost的線程庫,也沒有采用ACE,自己實現(xiàn)了一套機(jī)制。
? ? ? ? ? 5. 線程模型
? ? ? ? ? ? ? ? 1. thfirt的線程庫包括三個部分:primitives, thread pool manager, timer manager
? ? ? ? ? ? ? ? 2. 每個線程是一個對象,提供了Runnerable接口供使用,Synchronized關(guān)鍵字實現(xiàn)類似java的同步塊功能。
? ? ? ? ? ?6. Thread,Runnable, and shared_ptr
? ? ? ? ? ?7. ThreadManager
? ? ? ? ? ?8. TimeManager
? ? ? ? ? ?9. NonBlocking Operation
? ? ? ? ? ?10. 編譯器
? ? ? ? ? ?11. TFileTransport
8. Facebook thrift service
? ? ? ? ? ?1. Search&&logging
? ? ? ? ? ? ? ? 1. TFileTransport可以實現(xiàn)對應(yīng)的結(jié)構(gòu)化logging, 這個logging日志可以用來做線上和線下的處理,可以作為redo log。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
