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流量/