UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

WebRTCの現状 - STUN/TURN・シグナリングサーバーについて - (5/8)

WebRTCを利用したビデオチャットアプリケーションはGoogle App Engine Channel API,を利用してシグナリングを行っている。

これは Comet (long polling)を利用してバックエンドの App Engine (余談ながらこのApp EngineのwebSocketサポートには、長い間修正されていないバグがある。)とクライアントのシグナリングを可能にしている。

そしてこの記事にはコードの簡単な説明がある。

f:id:mochizuki_p:20160908105614j:plain

一つ付け加えておくと、WebRTCのクライアントがメッセージングサーバーに繰り返しAjaxでリクエストを送ることでシグナリングを行うことも可能だけど、これはかなり余計なネットワークリクエストを必要とするので、特にモバイル環境で問題を引き起こすかもしれない。たとえセッション確立後でも、ピアは他のピアのセッション終了や変更に備えてシグナリングメッセージを出し続けなければいけないからだ。この WebRTC Book のアプリの例は polling の回数の最適化を施した上でこの手段を利用している。

シグナリングをスケーリングする

シグナリングサービスはあまり帯域とCPUパワーを消費しないとはいえ、ほとんどのアプリでシグナリングサーバーは同時間帯に、さまざまな場所からの大量のメッセージを仲介する。WebRTCを利用するアプリケーションは相当な負荷にたえるためにシグナリングサーバーを必要とする。

ここでは詳細を説明するのは避けておきたいけれど、ハイパフォーマンスなシグナリングサーバーを実現するには複数の選択肢がある。

  • XMPP(eXtensible Messaging and Presence Protocol)、当初はJabberと言う名前だった。インスタントメッセンジャーのために開発されたプロトコルで、サーバー実装は ejabberd と Openfireを含み、Strophe.jsのような JavaScriptでのクライアントはBOSHを利用して双方向のストリーミングをエミュレートしている。しかしBOSHはWebSocketには向いていないかもしれない。これはあまりスケーリングがうまくできないという理由と同じものだ。(これは見方を変えれば、Jingleは音声と動画を扱えるようにしたXMPPの拡張で、WebRTCプロジェクトはネットワークとJingleのC++実装であるlibjingleライブラリを利用している。)

  • ZeroMQやその概念を、STOMPプロトコルをWebSocketを介して使用して、Webに応用したOpenMQ、NullMQのようなオープンソースライブラリ

  • WebSocket(long pollingに回帰するかもしれないけれど )を利用した商用クラウドメッセージングプラットフォーム、たとえばPusherやKaazing、PubNub(これはWebRTC用のAPIがある)

  • vLineのような商用WebRTCプラットフォーム

開発者のPhil LeggetterのReal-Time Web Technologies Guide はこの種のメッセージんグサービスとライブラリを網羅している

シグナリングをNode.jsのSocket.ioで構築する。

以下のコードはNode.jsのWebSocket実装であるSocket.ioで構築されたシグナリングサービスです。Socket.ioの設計はメッセージ交換サービスをシンプルに構築できるようにすることです。これはその「ルーム」というアイデアのため、特にWebRTCのシグナリングに適しています。この例はスケーラビリティを考慮していませんが小規模であれば十分に動作します。

Socket.ioはさまざまな環境で実装されています。たとえばAdobe Flash SocketやAJAX long polling、AJAX multipart streaming,そしてForever IframeやJSONP pollingです。これらはさまざまなバックエンドで活躍していましたが、Node.jsでの実装が一番有名です。

この例にはWebRTCのコードはありません。それはWebアプリでどのようにシグナリングサービスを構築するかを説明するためです。

console.logをみてクライアントがルームに参加してメッセージを交換するときに何が行われるか確認してみてください。WebRTC codelab ではこの例をどのようにWebRTCのチャットアプリに組み込むかを教えます。

step 5 of the codelab repo からコードをダウンロードして、試しにt samdutton-nodertc.jit.su:を実行してみてください。

このURLを2つのブラウザで同時に開いてビデオチャットを試してみるといいでしょう。

5/8