HTTPリアルタイム通信をまとめてみた
リアルタイム通信とは
そもそも「リアルタイム」の意味は界隈によって様々ありますが、本記事ではWEBアプリケーションにおいて「サーバ側の更新によりクライアント側も更新される」という意味合いで進めていきます。つまり、リロードしなくても自動でページが変化するようなアプリケーションを手助けしてくれる通信を「リアルタイム通信」とします。例えば、LINEやSlackのようなライブチャットや、Google Documetなどのコラボレーションツールが挙げられれます。
リアルタイム通信技術
WEBアプリケーションはHTTP通信によって成り立っています。HTTPの大きな特徴は以下の3つです。
- クライアント/サーバモデル
- リクエスト/レスポンス
- ステートレスプロトコル
それぞれの説明は省きますが、HTTPにおいて、サーバがクライアントからの各リクエストを独立して扱うため、基本的に連続したリクエスト間での状態を紐づけることができません(ステートレス性)。リアルタイム通信はクライアントサーバ間の継続的なデータのやり取りを反映する必要があるため、そもそもHTTPはリアルタイム通信に向いてません。
そこで、HTTPの制約を守りながらリアルタイム通信を行う手法を先に3つ紹介します。
Polling
Pollingとは、クライアントが定期的にサーバへリクエストを行う通信技術です。リクエストが到達する前にデータが更新されていれば、クライアントはレスポンスにより更新データを取得できます。一方、データ更新がない場合は、当たり前ですがクライアントにはデータが届きません。このリクエスト・レスポンスを定期的に繰り返すことで、リアルタイム通信を実現しています。
PollingはHTTPの基礎的な通信を定期的に繰り返すだけなので実装が簡単なものであり、レガシーなブラウザやWEBサーバに対しても実現が容易です。ただ、リアルタイム性を求めてリクエスト間隔を狭めると無駄な通信処理が発生するトレードオフの問題があります。
Pollingとは、リクエスト間隔に依存するクライアントベースなリアルタイム通信です。
Long Polling
Long Pollingとは、クライアントがデータの更新が発生するまでレスポンスを待機する通信技術です。レスポンスを受け取った後すぐリクエストを行うことで継続的なリアルタイム性を実現します。
Long Pollingはサーバ側でデータの更新が発生してからすぐにレスポンスを返すため、データ更新間隔に依存したリアルタイム性を有します。一方でクライアントはレスポンス待機状態を維持するため、データの更新に関わらずコネクションを浪費します。また、Pollingも含めて、同時に複数のデータを扱う場合はコネクションを多重に消費します。
Long Pollingとは、データ更新間隔に依存するクライアントベースなリアルタイム通信です。
Server-Sent Events(SSE)
SSEはHTML5に標準化されたAPIの一種であり、これまで紹介したクライアントベースな通信ではなく、サーバプッシュなリアルタイム通信を提供します。リアルタイム性はLong Pollingと同様にデータ更新間隔ですが、一度接続したコネクション(レスポンス)を継続します。これはHTTPヘッダのコンテントタイプをSSEイベントストリームと指定することで、レスポンスを閉じることなくストリーム通信を維持できるためです。
先ほどの2つのPolling技術はデータの取得の都度リクエストを送っていたため、サーバはリアルタイム性の向上およびクライアント数の増加に伴って負荷が強くなります。一方、SSEはストリーム通信としてクライアントと通信し続けるため、リクエスト・レスポンスに必要なオーバヘッドとなるヘッダ情報が必要ありません。そのため、ポーリング技術よりも軽量な通信といえますが、SSEはサーバからクライアントへの単方向なストリーム通信のみを許します。
つまり、SSEはクライアントのリクエストを必要とせず、データ更新を元に通信できるサーバプッシュ型の通信です。
まとめ
Polling | Long Polling | SSE | |
---|---|---|---|
ベース | クライアント | クライアント | サーバ |
リアルタイム性 | リクエスト間隔 | データ更新間隔 | データ更新間隔 |
通信 | 定期的なコネクション | データ更新毎のコネクション | ストリーム通信 |
汎用性 | ◎ | ◎ | △(HTML5要対応) |
ステートレスなHTTP通信におけるリアルタイム通信技術について3つまとめました。Pollingはレガシーなネットワークに対応しており、リクエストを繰り替えすだけの軽量な実装である利点から、簡単なアプリケーションやデータ更新頻度が少ないメトリクスダッシュボードや天気アプリなどに向いています。Long PollingもHTTPの基本技術のみを使用しているため、よりリアルタイム性を求めた汎用的なアプリケーションに向いています。SSEはLong Pollingと同様のリアルタイム性に加えて通信負荷が軽いことから、クライアント数が多くデータの更新頻度の高いインスタントメッセージアプリケーションに利用されます。
次回は、SSEのように単方向ではなく双方向リアルタイム通信を可能にしたWebSocketの紹介と簡単な実装をまとめようと思います。
参考
Discussion