先日行われた Kranky Geek で Discord が “Multiparty Voice and Video for Gamers” というタイトルで、どのように WebRTC を利用しているかを発表していました。
気になった部分だけ簡単にコメントしていきます。英語の理解が間違っている場合もあるのでその場合は是非コメントで指摘もらえると助かります。
Discord はデスクトップクライアントには Electron を利用しており、iOS アプリには React Native を利用しています。Android は Kotlin で書かれており、React Native は利用しておりません。
とくに iOS と Android で利用している WebRTC ライブラリにはカスタマイズが入っています。
SDP を利用しておらず、さらに DTLS-SRTP を利用していません。これはかなり攻めています。特にDTLS-SRTP を利用せず Salsa20 (ChaCha20 の古い名前) を暗号に利用することで AES の速度の約二倍を実現しているとのことです。
メインとなる Voice Server は Elixir と C++ で書かれています。
Elixir はシグナリング部分の処理を主に担当しています。WebSocket を利用しており、暗号鍵の生成や SFU 自体のモニタリングを担当しています。
SFU は C++ で書かれており ICE や DTLS-SRTP の鍵交換まで、さらに RTCP のハンドリングを担当しています。
この構成で 1 ホストで 1 万 2 千の音声ユーザを 1 台のホストに格納することが可能になっています。
実際のハードウェアは 13 のリージョンで動いており、GCP を利用はしておらず、オンプレで動作しているとのことです。
この辺の話は以前に Discord がブログで公開した記事を読むことをおすすめします。
今後の可能性や課題については、複数人数のビデオクオリティで Simulcast や SVC があげられていました。複数人数のビデオチャットという仕組み自体に課題が山ほどあるのでそれを一つ一つ潰していくという感じになりそうです。
Discord は必要な仕組みを一つ一つ作っていき、自社で開発、運用してる強みを生かしてできるだけ軽量な仕組みを提供していきたいと考えているようです。
WebRTC 自体にもかなり手を入れていく方向なのでしょう。今後も彼らがどんな技術を利用していくのか見逃せません。