簡單二進位制編碼(SBE)

banq發表於2015-04-04
Real Logic Limited的簡單二進位制編碼(Simple Binary Encoding簡稱SBE)提供低延遲高效能的二進位制編碼。其效能比Google的Protocol Buffer快20倍。

SBE靈感是來自於高效能工作組的 FIX Protocol Limited (FPL)組織,其最初目標是提供金融交易的低延遲的二進位制編碼。

隨著微服務架構普及,服務之間通訊協議的效能要求越來越高,傳統的XML/JSON已經很難滿足微服務直接的高速通訊,直接使用壓縮的二進位制編碼資料成為一種選擇,Google的 Protocol Buffer、來自Apache的 Thrift 和 Avro,而SBE可謂是一匹黑馬。

大多數系統的效能問題是訊息的編碼和解碼,資料與JSON/XML之間的轉換比業務邏輯還要耗費CPU,SBE能夠讓系統更加有效率,SBE是透過一系列設計原則來完成這個目標。這些設計原則有:

1.Copy-Free:不採取中間緩衝,因為其在多次位元組複製中有效能損耗。採取直接與底層緩衝編碼與解碼,其限制是訊息大小不能超過傳輸快取的大小,可以進行碎片分段。

2.Native Type Mapping:copy-free的設計也透過將資料直接編碼為底層緩衝的原生型別中得到巨大好處,比如一個64位整數型能直接作為x86_64 MOV彙編指令被編碼進入底層緩衝。透過這種原生的型別對映,一個欄位能夠以類似高階語言如C++/Java中class類似和struct欄位一樣高效率訪問。

3.Allocation-Free:物件的分配會導致CPU快取流失從而降低效率,這些被分配的物件後來得收集並刪除,對於Java是使用垃圾回收機制,導致stop-the-world暫停。SBE編碼採取flyweight 模式,基於底層緩衝的flyweight視窗直接對訊息編碼與解碼,相應型別的享元是基於訊息頭部模板id選擇的。

4.Streaming Access:現代記憶體子系統已成為愈加複雜,該演算法能夠對效能和一致性有很大幫助,實現最好的效能與最一致的延遲,這是以一種上升順序方式訪問記憶體的方式實現的,也就是一種流。

5.Word Aligned Access:當word以非word大小邊界訪問時,多CPU架構表現出顯著效能問題,一個word的起始地址應該是其以位元組為單位大小的倍數,64位整數只能從位元組地址能被8整除的地方開始,32位整數只能從被4整除的位元組地址開始。。等等。

SBE的schema支援定義了訊息欄位起始位置的偏移概念,它假設訊息是被封裝在8位元組大小邊界內的框架協議中,為了實現緊湊與有效,訊息欄位應該以其型別和降序大小排序。

6.Backwards Compatibility向後相容:相容過去系統。

SBE專案:

real-logic/simple-binary-encoding · GitHub

比Google的Protocol Buffer快20倍

Uber已經從HTTP+JSON遷移到基於TChannel的Thrift,TChannel在Node.js中比HTTP快20倍。

微服務實現工具概述

[該貼被banq於2015-04-05 09:32修改過]

相關文章