簡單二進位制編碼(SBE)
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專案:
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
Uber已經從HTTP+JSON遷移到基於TChannel的Thrift,TChannel在Node.js中比HTTP快20倍。
[該貼被banq於2015-04-05 09:32修改過]
相關文章
- 【Redis】原始碼編譯二進位制包Redis原始碼編譯
- js讀寫二進位制檔案簡單程式碼例項JS
- javascript讀寫二進位制檔案簡單程式碼例項JavaScript
- 一個簡單的二進位制加法器
- ASCII碼是幾位二進位制碼?ASCII
- 二進位制反碼求和
- 二進位制與二進位制運算
- js二進位制和十進位制轉換程式碼JS
- 進位制詳解:二進位制、八進位制和十六進位制
- 一個簡單的十六進位制解碼器
- JavaScript 二進位制、八進位制與十六進位制JavaScript
- (二進位制)
- 二進位制
- 十進位制——二 (八、十六 )進位制
- 二進位制,八進位制,十進位制,十六進位制的相互轉換
- 【進位制轉換】二進位制、十六進位制、十進位制、八進位制對應關係
- 二進位制、十進位制與十六進位制相互轉化
- java中二進位制、八進位制、十進位制、十六進位制的轉換Java
- 二進位制,八進位制,十進位制,十六進位制之間的轉換
- Python 進位制互相轉換(二進位制、十進位制和十六進位制)Python
- 計算機基礎進位制轉換(二進位制、八進位制、十進位制、十六進位制)計算機
- 十進位制轉換為十六進位制和二進位制程式碼例項
- 二進位制轉十進位制快速方法
- JAVA 二進位制,八進位制,十六進位制,十進位制間進行相互轉換Java
- 費納姆密碼-二進位制密碼密碼
- 常用單位進位制
- 簡單電路實踐——電路與二進位制運算
- 什麼是二進位制?二進位制如何轉換?
- 理解二進位制原碼、反碼、補碼
- 二進位制的原碼、反碼、補碼
- 04 二進位制
- UltraEdit--二進位制檔案編輯功能
- ACM 16進位制的簡單運算ACM
- 大話二進位制,八進位制,十進位制,十六進位制之間的轉換
- JavaScript十進位制轉換為二進位制JavaScript
- Oracle二進位制與十進位制轉換Oracle
- 十進位制轉二進位制推導(草稿)
- [計算機基礎] 計算機進位制轉換:二進位制、八進位制、十進位制、十六進位制計算機