Discord是如何降低40%的WebSocket流量?
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的方法進行測試
- 在後端同時使用
zlib以及zstd壓縮一小部分流量 - 收集測量數據
- 拋棄被
zstd壓縮的資料,因為測量數據已經被儲存了
不過起初zstd並未贏過zlib
原因是zlib使用了streaming compression而zstd沒有,所以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流量/