Discord是如何降低40%的WebSocket流量?

以下為Quastor的文章總結,該文章是總結Discord的文章

Discord就不多做介紹了,所有的文字、檔案以及影片都需要透過網路傳遞,因此盡可能的降低流量至關重要

原本用什麼壓縮?

自2017,Discord都是使用zlib壓縮訊息,可以讓檔案變小2至10倍小

現在換成什麼?

經過Discord團隊的測試和調校,改為使用zstd以及Passive Sessions v2,本文重點討論zstd的部分

zstd?那是什麼?

Zstandard(zstd)是由Facebook開發的壓縮演算法,因其高效性和靈活性而受到許多科技公司採用,例如Uber, AWS, Meta。它具有22種壓縮等級,可調整速度和壓縮率的平衡,且支援字典壓縮技術,特別適合於小型訊息的壓縮。

賣點:

  • 自由的調整Compression ratios和速度之間的平衡
  • 良好的支援
  • 適合小型訊息的壓縮(小資料的壓縮是大多數壓縮演算法的痛點)

Discord怎麼測試其效能?

他們使用名為dark launch的方法進行測試

  1. 在後端同時使用zlib以及zstd壓縮一小部分流量
  2. 收集測量數據
  3. 拋棄被zstd壓縮的資料,因為測量數據已經被儲存了

不過起初zstd並未贏過zlib

原因是zlib使用了streaming compressionzstd沒有,所以Discord就幫zstd實作了這個功能貢獻社群,在estd library,此後zstd的壓縮率就贏過zlib

壓縮率從6變成10,平均payload從270bytes降到166bytes

調校zstd

要充分發揮zstd的功能就必須調校其參數以完美適用,團隊主要調整以下三個參數

  • Hashlog: 決定最大Hash Table大小,越大壓縮效果越好但效能越差
  • Chainlog: 二級資料結構,用於解析collision,也是數值越大壓縮效果越好,但需要更多記憶體與壓縮時間
  • Windowlog: sliding window的大小,一樣也是越大壓縮率越好,但需要更多記憶體和時間

結果

最終把所有平台都換成zstd,這些改進讓bandwidth使用減少了40%


Discord是如何降低40%的WebSocket流量?
https://f88083.github.io/2024/10/14/Discord是如何降低40-WebSocket流量/
作者
Simon Lai
發布於
2024年10月14日
許可協議