MessagePack

閱讀時間約 3 分鐘
當我們在討論 Web Applications 中的數據交換時,JSON 常是第一時間想到的格式,它有著易於閱讀且跨語言、開發成本低等優點。但當傳輸的數據量開始變大時,我們是不是有別種的選擇呢?
在我的經驗中,有時會碰到需要透過網路傳輸資料和處理請求但資料量還不算小狀況,所以經常會思考如何加速請求。這裡的手段有好幾種,例如:從 Server 著手的 CDN、GZIP。而這篇要討論的是從內容著手,主要談論的是 MessagePack。

簡介

MessagePack 是一種數據交換格式,類似於 JSON,但更小!更快!MessagePack 使用二進制序列化格式來表達數據資料及結構。以下是官方的示意圖:
MessagePack 將 JSON 需要 27 bytes 所表示的數據用 18 bytes 就完成了。

如何使用?

官網上有多種語言的實現版本 [link]

壓縮原理

👉 參閱規格 [link]
其中值得關注的是 Extension 格式

擴充格式

透過 Extension Type 可以自定義不同的資料類型,好比說可擴充 UUID 格式。但由於格式上的限制,最多只可支援到 127 種擴充格式(應該也是蠻夠用了😂
Shopify Engineering Blog 中也提到他們在做遷移到 MessagePack 時,透過 Extension Types 實現了在 MessagePack 中所沒有支援的 Rails 格式 [link]

Break down

這裡先給個 JSON 格式的 Example Data: Blog Articles
經過 MessagePack Packed 以後的資料會長這樣:
透過官方的規格來拆解每個 Byte,我們可以理解他是如何解釋這些資料的

序列化格式比較

上面大致瞭解了 MessagePack 後,接下來我們就來看一下其他的競品,並做幾個小實驗 [link]
P.S. 這裡就不提 ProtocolBuffers 的原理,單做 JSON 和 MessagePack 以及 Protocol Buffers 的比較
實驗方式:
  1. 對比不同序列化格式轉換後資料大小
  2. 對比各個格式的序列化時間
  3. 對比各個格式的反序列化時間
  4. 透過壓力測試工具來模擬實際請求的狀況:平均回覆時間、中位數時間
實驗結果:
results of the experiment

總結

雖然以數據來看 Protocol Buffers 獲得壓倒性優勢,但別忘了它是需要預先編譯的,使用上沒這麼直覺,且和 MessagePack 一樣都是無法直接閱讀的。
那麼是否該從 JSON 遷移到 MessagePack 呢?答案是取決於使用情境
一般來說小型的數據量用 JSON 是不會感覺出明顯差異的,但當數據成長到一定的量級後,序列和反序列化就是程式中不小的瓶頸了,且儲存空間和網路傳輸也都是成本。
1會員
2Content count
留言0
查看全部
發表第一個留言支持創作者!
你可能也想看
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!
Thumbnail
重點摘要: 1.9 月降息 2 碼、進一步暗示年內還有 50 bp 降息 2.SEP 上修失業率預期,但快速的降息速率將有助失業率觸頂 3.未來幾個月經濟數據將繼續轉弱,經濟復甦的時點或是 1Q25 季底附近
Thumbnail
近期的「貼文發佈流程 & 版型大更新」功能大家使用了嗎? 新版式整體視覺上「更加凸顯圖片」,為了搭配這次的更新,我們推出首次貼文策展 ❤️ 使用貼文功能並完成這次的指定任務,還有機會獲得富士即可拍,讓你的美好回憶都可以用即可拍珍藏!