Discord の採用している技術

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

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

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

Electron

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

React-Native

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

React-Native は例のライセンス問題がまだ存在している。

WebRTC

音声や映像の通信には WebRTC を利用している。P2P ではないようで、サーバ経由と見ている。SDP を見る限り P2P で利用される SDP ではない。

実際一人で接続ができる。P2P の場合は必ず相手がいないと接続ができない。

ただ、なんのサーバを利用しているかは SDP を見る限りはわからなかった。Mixer で利用されている Janus 、OSS として有名な mediasoup 、Twilio が買収した Kurento 、Hipchat の Jitsiといったメジャーな SFU が採用している SDP ではなかった。このあたり何か気づいた人はコメントしてほしい。

また TURN サーバは用意していない。つまり UDP が通信できる前提だ。これはゲーム向けだからか UDP が通信できない状況で使うな!という思いがあるのかもしれない。

設定やパラメータは Chrome 向けにかなりチューニングされている印象がある。Electron や libwebrtc ベースということもあるのだろう。

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 と書かれている。

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 億行のログを送っている。

参考

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.