Discord の採用している技術

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

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

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

Electron

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

React-Native

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

WebRTC

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

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

ただ、なんのサーバを利用しているかは SDP を見る限りはわからなかった。Mixer で利用されている Janus や mediasoup や Kurento 、 Jitsiといったメジャーな OSS が採用している SDP ではなかった。

また TURN サーバは用意していないようで、UDP が通信できる前提だ。これはゲーム専用だからか UDP が通信できない状況で使うんじゃねぇという思いがあるのかもしれない。

React / Babel / Webpack

クライアントは React ベースで ES6 を採用。ビルドは Webpack のようだ。

クライアントが明るくないので、もしもう少し詳しい情報があったらコメントしてほしい。

Cassandra / Elasticsearch

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

Apache Beam

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

Elixir

https://github.com/vishnevskiy CTO が Elixir 大好きな模様。

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

C++

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

Python / Go

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

参考