Discord の採用している技術

Discord はゲーマー向けのボイスチャットサービス。テキストチャットもできるし最近ではビデオチャットや画面共有もできるようになった。

UI はかなり Slack に似ている、モダンなデザインということなんだろう。

WebRTC 技術を利用しているということで、とても気にはなっていたが使うタイミングがなかったことからあまり追いかけていなかったが、先日ビデオチャットと画面共有が追加されたということで色々調べてみることにした。

Electron

Windows/Mac/Linux 向けのデスクトップクライアントには Electron を採用している。かなり早い段階から採用しているイメージ。Electron は Chromium ベースなので WebRTC が利用できる。WebSocket もバリバリ使ってる模様。 Electron を使うことでブラウザとほぼ変わらぬ動き、UI を再現している。

React-Native

iOS/Android クライアントには React-Native を採用している。こちらもかなり早い段階から採用している記憶がある。

iOS のみ React Native で Android アプリとしては利用していないらしい。

WebRTC

音声や映像の通信には WebRTC を利用している。WebRTC SFU を C++ で開発しているとのこと。同時接続数は 250 万。

何が凄いって libwebrtc をいじって負荷対策として暗号部分を AES-CTR から Salsa20 に切り替えている。ブラウザはAES-CTR だがモバイルは Salsa20 らしい。

React / BabelWebpack

クライアントは React ベースで Babel を利用しての ES6 を採用。ビルドは Webpack のようだ。Flux を使っていると書いてあるがそのままとっていいのかわからない。

クライアント側で明るい方、何かあればコメントしてほしい。

Apache Cassandra / Elasticsearch

メッセージの記録は全て Cassandra へ。検索は Elasticsearch 。

Apache Beam

名前くらいしか知らないので … バッチ処理やストリーミング処理でデータ処理をするフレームワーク … っぽい。すみません詳しい方コメントを。

Discord はメインで GCP を使っているようなのでバックエンドは Cloud Dataflow だと思われる。

Apache Airflow

初めて聞いたレベル。Airbnb が開発してその後 Apache へという流れらしい。ワークフローエンジンとのこと thx Aki Ariga

ElixirErlang

https://github.com/vishnevskiy Discord の CTO が Elixir 大好きに見える。

メッセージ配信とかは全て Elixir を採用している模様。通信部分は WebSocket を利用していて王道。結構気合い入れて利用している。

Elixir をやる以上は Erlang VMもわからないといけないので、 きちんと募集要項に Erlang VM と書かれている。

WebRTC のシグナリングも Elixir で書かれている。

C++

libwebrtc も Electron も C++ だし、コアになる WebRTC サーバもおそらく C++ で書かれている。ゲームに組み込む SDK も C++ 。

Python / Go

データ解析やインフラ系には Python をメインとして Go も採用している。

https://github.com/discordapp/erlpack これは Python で、マニアックに Erlang の Term を encode/decode するライブラリ

https://github.com/discordapp/punt これは Go で Elsaticsearch にログを転送するクライアント。日に 25 億行のログを送っている。


2018 年にはもう登録 1.3 億ユーザ、デイリー 1900 万ユーザ、同時接続 820 万ユーザという化物みたいなサーバになっている。

参考