PeerServer の分散構成

概要

WebRTC の定番ライブラリの一つである PeerJSシグナリングサーバーとして利用される PeerServer を分散構成に対応させました。

tsujio/peerjs-server at distributed-store - GitHub

詳細

WebRTC では相手と通信を始めるために SDP や ICE メッセージの交換を行う必要があり、PeerJS ではそれらのメッセージの中継を行う役割を PeerServer が担っています。

しかし、PeerServer は P2P ネットワークに存在する全てのピアと常時 WebSocket のコネクションを保持しており、ピア数が十分大きくなると破綻してしまうという問題がありました。

そこで WebRTC を利用した大規模な P2P ネットワークを構築できるようにするために、通常一台構成でしか運用できない PeerServer を複数台の分散構成に対応できるようにしました。

構成図

f:id:ntsujio:20140704180134p:plain

解説

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 を

  • 分散構成に

  • 対応した