MessagePack

更新於 發佈於 閱讀時間約 4 分鐘

當我們在討論 Web Applications 中的數據交換時,JSON 常是第一時間想到的格式,它有著易於閱讀且跨語言、開發成本低等優點。但當傳輸的數據量開始變大時,我們是不是有別種的選擇呢?

在我的經驗中,有時會碰到需要透過網路傳輸資料和處理請求但資料量還不算小狀況,所以經常會思考如何加速請求。這裡的手段有好幾種,例如:從 Server 著手的 CDN、GZIP。而這篇要討論的是從內容著手,主要談論的是 MessagePack。

簡介

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

raw-image

如何使用?

官網上有多種語言的實現版本 [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. 透過壓力測試工具來模擬實際請求的狀況:平均回覆時間、中位數時間

實驗結果:

raw-image


總結

雖然以數據來看 Protocol Buffers 獲得壓倒性優勢,但別忘了它是需要預先編譯的,使用上沒這麼直覺,且和 MessagePack 一樣都是無法直接閱讀的。

那麼是否該從 JSON 遷移到 MessagePack 呢?答案是取決於使用情境

一般來說小型的數據量用 JSON 是不會感覺出明顯差異的,但當數據成長到一定的量級後,序列和反序列化就是程式中不小的瓶頸了,且儲存空間和網路傳輸也都是成本。




留言
avatar-img
留言分享你的想法!
avatar-img
Tony的沙龍
1會員
2內容數
你可能也想看
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
常常被朋友問「哪裡買的?」嗎?透過蝦皮分潤計畫,把日常購物的分享多加一個步驟,就能轉換成現金回饋。門檻低、申請簡單,特別適合學生與上班族,讓零碎時間也能創造小確幸。
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
我們在學習kafka的過程中最不習慣的就是不管什麼樣的資料, 在kafka的傳輸過程都會是binary的資料格式, 因此我們在撰寫程式的過程中並不是那麼的直觀, 必須將資料從float、int…資料型態轉型成binary才能順利傳送, 那麼基於這樣的前提之下, python這套程式語言可以怎麼做
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
JSON(JavaScript Object Notation)是一種用於資料交換的輕量級資料格式,通常用於網路應用程式之間的資料傳遞。 JSON的格式易於閱讀和撰寫,也易於解析和產生,因此它在開發中被廣泛使用。 JSON由兩種結構組成:物件(Object)和陣列(Array)。
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
關於json的資料交換格式請參考「【程式語言 - Javascript】輕量資料格式 JSON」, 我們常常會在使用套件的過程中發現回傳值的型態都會有「dict」的蹤跡, 為什麼呢? 因為動態、彈性、靈活, 不需要預先定義類別來明確指定每個欄位的內容, 但缺點就是文件必須寫清楚內容物是哪些, 否
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
👨‍💻 簡介 今天的encoding/json package是我日常在開發web時很常用到的package之一,主要是用來將Go struct和 JSON 之間進行轉換。主要功能為資料序列化(marshalling)和反序列化(unmarshalling)。
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
最近跟著影片學習NodeJS,第一部分先學習對Buffer的處理跟理解,以下是對於NodeJS Buffer的理解筆記
Thumbnail
我們在「」有稍微介紹了JSON格式, 也知曉JSON格式非常簡單暴力, 只要一對<key>與<value>就能成行, 對於工程人員來說已經比XML、文字檔…等傳統格式更加容易理解, 而且也具備一定的資料型態基礎, 但使用這麼久以來常常發現到想要對某個欄位註解時好像不太容易, 頂多就是多一個欄位叫做「
Thumbnail
我們在「」有稍微介紹了JSON格式, 也知曉JSON格式非常簡單暴力, 只要一對<key>與<value>就能成行, 對於工程人員來說已經比XML、文字檔…等傳統格式更加容易理解, 而且也具備一定的資料型態基礎, 但使用這麼久以來常常發現到想要對某個欄位註解時好像不太容易, 頂多就是多一個欄位叫做「
Thumbnail
當我們在討論 Web Applications 中的數據交換時,JSON 常是第一時間想到的格式,它有著易於閱讀且跨語言、開發成本低等優點。但當傳輸的數據量開始變大時,我們是不是有別種的選擇呢?
Thumbnail
當我們在討論 Web Applications 中的數據交換時,JSON 常是第一時間想到的格式,它有著易於閱讀且跨語言、開發成本低等優點。但當傳輸的數據量開始變大時,我們是不是有別種的選擇呢?
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News