サーバpushざっくりまとめ

57
サーバPUSH ざっくりまとめ 2014/8/11 (2013/10に一度お蔵入り) り道 康博

Upload: yasuhiro-mawarimichi

Post on 12-Jun-2015

5.681 views

Category:

Technology


1 download

DESCRIPTION

ポーリング、Ajax、Comet、Server Sent Events、WebSocket サーバPUSH方式の大雑把な比較

TRANSCRIPT

Page 1: サーバPUSHざっくりまとめ

サーバPUSH ざっくりまとめ

2014/8/11 (2013/10に一度お蔵入り)

!

囬り道 康博

Page 2: サーバPUSHざっくりまとめ

目的

•PUSHについて以下のことを確認 •何でWebSocketがいいんだっけ •従来の方式は何がよくないんだっけ •そもそも何があったっけ

Page 3: サーバPUSHざっくりまとめ

概要•各方式をざっくり確認+比較 •ポーリング •Ajax • Comet • Server Sent Events •WebSocket •図は以前書いたWebSocket / WebRTCの技術紹介から

Page 4: サーバPUSHざっくりまとめ

ポーリング (1/4)• クライアント契機でHTMLを取得 • 疑似PUSH

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

Page 5: サーバPUSHざっくりまとめ

ポーリング (1/4)• クライアント契機でHTMLを取得 • 疑似PUSH

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

Page 6: サーバPUSHざっくりまとめ

ポーリング (1/4)• クライアント契機でHTMLを取得 • 疑似PUSH

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

Page 7: サーバPUSHざっくりまとめ

ポーリング (1/4)• クライアント契機でHTMLを取得 • 疑似PUSH

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

画面を更新

Page 8: サーバPUSHざっくりまとめ

ポーリング (1/4)• クライアント契機でHTMLを取得 • 疑似PUSH

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

画面を更新

Page 9: サーバPUSHざっくりまとめ

ポーリング (2/4)•初期の疑似PUSH •昔のBBSやチャット •HTTPクライアントがHTTPサーバへ定期的にアクセスして画面を再描画

•リアルタイム性はアクセス間隔に依存

Page 10: サーバPUSHざっくりまとめ

ポーリング (3/4)

•メリット •昔(とても昔)のブラウザでも動く •特殊なことはやっていない

Page 11: サーバPUSHざっくりまとめ

ポーリング (4/4)•デメリット •リアルタイム性が低い •リアルタイム性を上げるために更新頻度を上げるとサーバ負荷上がる

•差分でなくフルのHTMLを毎回取得する •クライアントは定期的にサーバへアクセスする •クライアントはサーバに新しい情報があるかどうか(だけを)知る術がない

Page 12: サーバPUSHざっくりまとめ

Ajax (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

画面を更新

• クライアント契機でXML/jsonを取得 • 疑似PUSH

Page 13: サーバPUSHざっくりまとめ

Ajax (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

画面を更新

• クライアント契機でXML/jsonを取得 • 疑似PUSH この辺がAjax

Page 14: サーバPUSHざっくりまとめ

Ajax (2/4)•Ajax = Asynchronous JavaScript + XML • XHR(XMLHttpRequest)で実装 • XMLでなくテキストでもいい •なのでJSONが使われることが多い(と思う)

•「ちょっとマシなポーリング」ができる

Page 15: サーバPUSHざっくりまとめ

Ajax (3/4)•メリット •ポーリング方式より通信負荷が低い •サーバから必要なデータだけ持ってくる •画面全体のHTMLを再取得しない

•「全データを予め取得するのが非現実的」で「状況に応じてデータを取得する」用途に向く

•Googleマップとか

Page 16: サーバPUSHざっくりまとめ

Ajax (4/4)•デメリット • PUSHの観点ではポーリングと変わらない •サーバからデータを送るにはクライアントからのアクセスが必要

•というかそもそもPUSHのリアルタイム性を上げるための仕様じゃない

Page 17: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH

Page 18: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH

Page 19: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

Page 20: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

Page 21: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

画面を更新

Page 22: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

次のPUSH用の リクエストを投げる

画面を更新

Page 23: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

次のPUSH用の リクエストを投げる

画面を更新

Page 24: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

次のPUSH用の リクエストを投げる

画面を更新

Page 25: サーバPUSHざっくりまとめ

Comet (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• サーバ契機でHTMLやXML/jsonを取得 • サーバからの即応性が改善された擬似PUSH データ発生まで

レスポンスを保留

この辺でデータが発生するとラグ

次のPUSH用の リクエストを投げる

画面を更新

Page 26: サーバPUSHざっくりまとめ

Comet (2/4)•ロングポーリング •一般に、サーバは可及的速やかにレスポンスを返す • Cometでは「PUSHしたい時」までレスポンスを返さない

•つまりポーリングよりポーリング間隔が長い •双方向通信 •クライアント to サーバは通常のHTTP •サーバ to クライアントはComet

Page 27: サーバPUSHざっくりまとめ

Comet (2/4)•ロングポーリング •一般に、サーバは可及的速やかにレスポンスを返す • Cometでは「PUSHしたい時」までレスポンスを返さない

•つまりポーリングよりポーリング間隔が長い •双方向通信 •クライアント to サーバは通常のHTTP •サーバ to クライアントはComet

この辺がロング

Page 28: サーバPUSHざっくりまとめ

Comet (3/4)

•メリット •リアルタイム性がポーリング方式より高い

Page 29: サーバPUSHざっくりまとめ

Comet (4/4)•デメリット •仕組み上、ごく短時間に連続でPUSHすることができない •一度PUSHすると、クライアントから次のPUSH用の接続を待たないといけない

•サーバは最大でポーリングの2倍のリソース(曖昧)を消費する •「サーバ to クライアント(Comet)」で1つ •「クライアント to サーバ(HTTP)」で1つ •ポーリング方式より不利というだけで、根本的にはどの方式でも同じ問題がついて回る(C10K問題)

Page 30: サーバPUSHざっくりまとめ

Comet (4/4)•デメリット •仕組み上、ごく短時間に連続でPUSHすることができない •一度PUSHすると、クライアントから次のPUSH用の接続を待たないといけない

•サーバは最大でポーリングの2倍のリソース(曖昧)を消費する •「サーバ to クライアント(Comet)」で1つ •「クライアント to サーバ(HTTP)」で1つ •ポーリング方式より不利というだけで、根本的にはどの方式でも同じ問題がついて回る(C10K問題)

あくまでも 最大だよ

Page 31: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

Page 32: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

Page 33: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH データ発生のたびに

送信する

Page 34: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

分割(chunked)データ扱い

データ発生のたびに送信する

Page 35: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

分割(chunked)データ扱い

データ発生のたびに送信する

画面を更新

Page 36: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

分割(chunked)データ扱い

クローズしていないのでさらに送れる

データ発生のたびに送信する

画面を更新

Page 37: サーバPUSHざっくりまとめ

Server Sent Events (1/4)

クライアント サーバ

HTTPリクエスト

HTTPレスポンス

• Cometを洗練させたWeb標準(W3C CR) • 本格的なPUSH

分割(chunked)データ扱い

クローズしていないのでさらに送れる

データ発生のたびに送信する

画面を更新

Page 38: サーバPUSHざっくりまとめ

•Server Sent Events (SSE) •新しいロングポーリング方式 • Chunked Transfer Coding • HTTPサーバがレスポンスを「分割(chunked)データ」として宣言する

•サーバはPUSHが必要になる度にクライアントへデータを送る

•データ = 「HTTPレスポンスの一部」をPUSHしても通信が維持される

Server Sent Events (2/4)

Page 39: サーバPUSHざっくりまとめ

•メリット •リアルタイム性がポーリングより高い • Cometに比べて、「一度サーバPUSHを受けた後にクライアントが再接続」する手間とラグがない

•サーバ側の実装が従来の延長で可能 •WebSocketのような新規格への対応が不要

Server Sent Events (3/4)

Page 40: サーバPUSHざっくりまとめ

•デメリット •HTTPクライアント(ブラウザ等)がServer Sent Eventsに対応していないといけない

•古いブラウザだと動かない •具体的にはIE(11でも×)とかAndroid標準ブラウザ(4.4未満は×)

• Cometと同じく、サーバは最大でポーリング方式の2倍のリソースを消費する

Server Sent Events (4/4)

Page 41: サーバPUSHざっくりまとめ

(補足) Streaming API •Twitterのアレ • Ajax + Chunked Transfer Coding •機能上の特徴はServer Sent Eventsと同等 •クライアント側の処理がServer Sent Eventsより複雑 • Server Sent Eventsの仕様ができるより前に、同等のことをHTTP 1.1 + Ajaxで実現したもの

•独自仕様の「Server Sent Eventsっぽい何か」と捉えても良い •と解釈しているんだけど、情報がいまいち出てこなくて正しいかわからない

Page 42: サーバPUSHざっくりまとめ

WebSocket (1/5)

サーバ

• HTTPの縛りを外して作られたWeb標準 (RFC 6455 / W3C CR) • 本格的なPUSH

WebSocket

メッセージ

Page 43: サーバPUSHざっくりまとめ

WebSocket (1/5)

サーバ

• HTTPの縛りを外して作られたWeb標準 (RFC 6455 / W3C CR) • 本格的なPUSH

WebSocket

メッセージ

Page 44: サーバPUSHざっくりまとめ

WebSocket (1/5)

サーバ

• HTTPの縛りを外して作られたWeb標準 (RFC 6455 / W3C CR) • 本格的なPUSH

WebSocket

メッセージ

データ発生のたびに送信する

Page 45: サーバPUSHざっくりまとめ

WebSocket (1/5)

サーバ

• HTTPの縛りを外して作られたWeb標準 (RFC 6455 / W3C CR) • 本格的なPUSH

画面を更新

WebSocket

メッセージ

データ発生のたびに送信する

Page 46: サーバPUSHざっくりまとめ

WebSocket (1/5)

サーバ

• HTTPの縛りを外して作られたWeb標準 (RFC 6455 / W3C CR) • 本格的なPUSH

画面を更新

WebSocket

メッセージ

データ発生のたびに送信する

Page 47: サーバPUSHざっくりまとめ

WebSocket

メッセージ

クライアント

WebSocket (2/5)

サーバ

Page 48: サーバPUSHざっくりまとめ

WebSocket

メッセージ

クライアント

送信完了前に別の送信を開始しても可

WebSocket (2/5)

サーバ

Page 49: サーバPUSHざっくりまとめ

WebSocket

メッセージ

クロスしても可

クライアント

送信完了前に別の送信を開始しても可

WebSocket (2/5)

サーバ

Page 50: サーバPUSHざっくりまとめ

WebSocket (3/5)•効率的な双方向通信のために作られた、HTTPと別の規格 •WebSocketプロトコルは通信仕様、IETF管轄 • http://tools.ietf.org/html/rfc6455 •単に使う分にはそれほど意識しなくてもいい •知っているに越したことはないが

•WebSocket APIはWebSocketをJavaScriptから使うためのAPI、W3C管轄

• http://www.w3.org/TR/websockets/

Page 51: サーバPUSHざっくりまとめ

WebSocket (4/5)•メリット •HTTPプロトコルと比較してヘッダが軽量=通信負荷が低い

•リアルタイム性が高い •サーバ to クライアントとクライアント to サーバで同じ経路

•サーバにやさしい、リソース的な意味で •標準化策定済み

Page 52: サーバPUSHざっくりまとめ

WebSocket (5/5)•デメリット •サーバ、クライアントともWebSocket規格への準拠が必要 •古いWebサーバやブラウザは非対応 • IE10未満とか、Android 4.4未満の標準ブラウザ

•既存の通信機器を通過できない可能性がある •例えば80番port = HTTPの前提で監査しているルータ等にWebSocket通信を流すと、異常データ扱いで弾かれることがある

• httpsだと中身が見えないので比較的通りやすい

Page 53: サーバPUSHざっくりまとめ

PUSH方式の比較リアルタイム性 サーバの

負荷 (低)Webサーバの

対応ブラウザの 対応

ポーリング /Ajax △~× ×~△ ○ ○

Comet ○ ○ ○ ○Server Sent Events ○ ○ ○ △

WebSocket ○ ○ △ △

Page 54: サーバPUSHざっくりまとめ

まとめ•WebSocket • Server Sent Events • Comet • Ajax •ポーリング

Page 55: サーバPUSHざっくりまとめ

まとめ•WebSocket • Server Sent Events • Comet • Ajax •ポーリング

越えられない壁

Page 56: サーバPUSHざっくりまとめ

まとめ•WebSocket • Server Sent Events • Comet • Ajax •ポーリング

おすすめ

非おすすめ越えられない壁

Page 57: サーバPUSHざっくりまとめ

蛇足•HTTP2がないね •そうすね、近いうちにRFC出そうですね •あっちのPUSHは「好きな時にサーバPUSH」じゃなく「Webページに必要そうなデータをサーバ契機で予め送信」のPUSH

• PUSH方式選択のポイントは(サポート対象の)ブラウザ •古いブラウザのサポートがmustな場合、新しい方式は辛いよ(今後も含めて)

•今のWebサーバやブラウザは大抵WebSocketに対応済み •でも通信経路的に使えないケースもあるから注意だよ •悩んだらとりあえずSocket.IOで安定