- クライアントがDiscordに接続すると、「ゲートウェイ」と呼ばれるサービスを通じて、何が起きているかのリアルタイム更新を受け取る
- 2017年末から、クライアントのゲートウェイ接続は
zlibを使って圧縮され、メッセージサイズは2倍から10倍まで小さくなった
- Zstandard(
zstd)はzlibより圧縮率が高く、圧縮時間も短く、辞書機能をサポートしているため、帯域幅をさらに削減できる
- 2019年の
zstdテスト結果はそれほど良好ではなかったが、再挑戦する価値があると判断した
Zstdストリーミング
zlibはストリーミング圧縮を使用していた一方、zstdはそうではなかった
- 小さなペイロードでは、
zstdはzlibより性能が劣っていた
- Elixir向け
zstdバインディングであるezstdをフォークし、ストリーミングを追加した
zstdストリーミングへ切り替えた結果、zlibストリーミングより圧縮率と速度の両面で大きく改善した
最適化の取り組み
チューニング
chainlog、hashlog、windowlogなどのzstd圧縮パラメータを調整し、メモリ使用量と圧縮時間のバランスを取った
Zstd辞書
zstdの辞書機能を活用して圧縮率を高めようとしたが、効果は限定的だった
- 辞書利用の複雑さが利点を上回ると判断し、導入しないことにした
バッファアップグレード
- 非ピーク時間帯の余剰メモリを活用し、
zstdバッファをアップグレードするフィードバックループを実装した
- 予想よりアップグレード率が低く、BEAMアロケータ設定の調整などで改善を試みたが、複雑さに対する利点が大きくないため撤回した
実装と展開
zstdの帯域幅改善効果が大きかったため、モバイルだけでなくデスクトップにも適用することにした
- Java、Objective-C、Rustなど、各プラットフォームに合った
zstdバインディングを見つけ、数か月にわたって段階的に展開した
追加の成果: Passive Sessions V2
zstd適用の過程で、passive_update_v1メッセージがゲートウェイ帯域幅の30%以上を占めていることを発見した
- 変更されたチャンネル/メンバーだけを送信する
passive_update_v2を導入し、その帯域幅を35%から5%に削減した
大きな削減効果
- Passive Sessions v2と
zstdの組み合わせにより、クライアントが使用するゲートウェイ帯域幅をほぼ40%削減した
- 意図せず最適化の機会を発見できたことは、適切な計測と批判的な視点でグラフを分析する重要性を示している
1件のコメント
Hacker Newsの意見
Discordの起動に20〜30秒かかることへの不満がある
圧縮率とネットワーク帯域幅の削減に注力したように見える
JSONとErlang ETFを使った辞書ベースの圧縮アプローチが興味深い
一般的なブートストラップ応答(READY)が2MB以上ある点に驚いている
PASSIVE_UPDATE_V1ディスパッチの実際の内容への言及
圧縮オラクル攻撃(BREACH)のような攻撃に対する安全性への言及がない
Discordのタブを開くとコンピューターが遅くなる問題がある
うまくいかなかったことについても説明している点がとても良い
mIRCのほうがよくできていたという意見