PeerServer の分散構成
概要
WebRTC の定番ライブラリの一つである PeerJS でシグナリングサーバーとして利用される PeerServer を分散構成に対応させました。
tsujio/peerjs-server at distributed-store - GitHub
詳細
WebRTC では相手と通信を始めるために SDP や ICE メッセージの交換を行う必要があり、PeerJS ではそれらのメッセージの中継を行う役割を PeerServer が担っています。
しかし、PeerServer は P2P ネットワークに存在する全てのピアと常時 WebSocket のコネクションを保持しており、ピア数が十分大きくなると破綻してしまうという問題がありました。
そこで WebRTC を利用した大規模な P2P ネットワークを構築できるようにするために、通常一台構成でしか運用できない PeerServer を複数台の分散構成に対応できるようにしました。
構成図
解説
memcached には「どの PeerServer がどのピアを管理しているか」といった情報が格納されており、PeerServer が新たなピアと接続を確立する度にその情報が登録されます。
各 PeerServer は自身の傘下のピアからメッセージを受け取ると、次のような動作をします。
if 宛先ピアが自身の傘下にいる then WebSocket でそのピアにメッセージを転送 else memcached に宛先ピアがどの PeerServer の傘下にいるか問い合わせる if 宛先ピアを管理している PeerServer が見つかる then その PeerServer にメッセージを転送 else 失敗 endif endif
この構成では、PeerServer が増えても転送にかかる時間は定数オーダーで済みます。また memcached のスケールが容易であることについては説明は不要かと思います。
クライアントの各 PeerServer への振り分けについては、DNS ラウンドロビンやロードバランサーの導入といった古典的な方法もありますが、PeerJS プロジェクト に複数 PeerServer を指定できるようにする修正を pull request として出すのもよいかもしれません。
まとめ
PeerServer を
分散構成に
対応した