Discord を支える WebRTC

先日行われた Kranky Geek で Discord が “Multiparty Voice and Video for Gamers” というタイトルで、どのように WebRTC を利用しているかを発表していました。

気になった部分だけ簡単にコメントしていきます。英語の理解が間違っている場合もあるのでその場合は是非コメントで指摘もらえると助かります。

Image for post
Image for post

Discord はデスクトップクライアントには Electron を利用しており、iOS アプリには React Native を利用しています。Android は Kotlin で書かれており、React Native は利用しておりません。

とくに iOS と Android で利用している WebRTC ライブラリにはカスタマイズが入っています。

Image for post
Image for post

SDP を利用しておらず、さらに DTLS-SRTP を利用していません。これはかなり攻めています。特にDTLS-SRTP を利用せず Salsa20 (ChaCha20 の古い名前) を暗号に利用することで AES の速度の約二倍を実現しているとのことです。

Image for post
Image for post

メインとなる Voice Server は Elixir と C++ で書かれています。

Elixir はシグナリング部分の処理を主に担当しています。WebSocket を利用しており、暗号鍵の生成や SFU 自体のモニタリングを担当しています。

SFU は C++ で書かれており ICE や DTLS-SRTP の鍵交換まで、さらに RTCP のハンドリングを担当しています。

この構成で 1 ホストで 1 万 2 千の音声ユーザを 1 台のホストに格納することが可能になっています。

実際のハードウェアは 13 のリージョンで動いており、GCP を利用はしておらず、オンプレで動作しているとのことです。

この辺の話は以前に Discord がブログで公開した記事を読むことをおすすめします。

今後の可能性や課題については、複数人数のビデオクオリティで Simulcast や SVC があげられていました。複数人数のビデオチャットという仕組み自体に課題が山ほどあるのでそれを一つ一つ潰していくという感じになりそうです。

Discord は必要な仕組みを一つ一つ作っていき、自社で開発、運用してる強みを生かしてできるだけ軽量な仕組みを提供していきたいと考えているようです。

WebRTC 自体にもかなり手を入れていく方向なのでしょう。今後も彼らがどんな技術を利用していくのか見逃せません。

Written by

Erlang/OTP / 時雨堂 / WebRTC / E2EE

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store