リクエストを待たずに送信を開始する「サーバプッシュ」~奥一穂氏による「HTTPとサーバ技術の最新動向」(中編)。Publickey×リクエストを待たずに送信を開始する「サーバプッシュ」~奥一穂氏による「HTTPとサーバ技術の最新動向」(中編)。20162016年2月23日WebサーバはWebの誕生と同時に登場したソフトウェアですが、「HTTPとサーバの技術はまだ進化中」と説明するのは、新しいWebサーバの実装「H2O」の開発者であるディー・エヌ・エーの奥一穂氏。サーバ技術の最新動向」の内容をダイジェストで紹介します。記事は3部に分かれています。いまお読みの記事は中編です。次はサーバプッシュの話です。サーバプッシュとはなにか。HTTP/2の背景にはレイテンシをなんとかしたいということがありました。HTTP/2にしたところで、どうしても1RTT(一往復)かかります。いうとHTTPはリクエストがないとレスポンスができないのですから。リクエストを待たずにサーバからクライアントにデータを送りつけたら0RTTになるんじゃないか、というのがサーバプッシュです。RTTが50msで、アプリケーションサーバの処理時間が200msの場合を考えてみます。Webブラウザからリクエストをすると、アプリケーションサーバの処理を200ms待ってHTMLが生成されて、そのあと全部のファイルを順番に取得すると、全体で450msかかります(図左)。アプリケーションサーバがHTMLを生成している200msのあいだにCSSやJavaScriptのファイルをプッシュしておけば、HTMLが届いた瞬間に、全体で250msでWebページが表示できます(図右)。これはCDNでも使えます。CDNのエッジサーバは近いところにあるのですぐにリクエストを返しますが、アプリケーションサーバは西海岸にあったりして反応に時間がかかることがあります。このとき、CDNにリクエストがきたらすぐにCSSやJavaScriptをクライアントに投げ始めて、その裏でリクエストを西海岸のサーバに投げれば、大幅に表示速度を改善できます。サーバプッシュにはいろいろ問題があります。優先度制御との関係、プッシュをどう起動するのか、そしてブラウザキャッシュをどう意識するのかといった問題です。サーバプッシュと優先度制御サーバプッシュと優先制御ですが、これはRFC通りに実装しても役に立たないんですね。サーバプッシュは、サーバプッシュを起動したリクエストより後に投げるとなっています。HTMLを早く表示するためにはCSSを先に投げないといけないのです。一方で画像ならばHTMLより後に投げたい。サーバプッシュはまだクライアントからリクエストが来ていないので、そういう優先度の指定もない。するかというと、サーバが自分で優先度を決めます。H2Oでは、プッシュするコンテンツのタイプを見て優先度を決めています。JavaScriptやCSSはHTMLより優先で、画像ならHTMLより後にするという処理が入っています。次はサーバプッシュをどうやって使うのか。こちらは標準化が進んでいます。アプリケーションサーバがLinkヘッダがあって、これはこれから返すレスポンスに使えそうなリンクをヘッダに入れられるんですね。style.cssをプリロードしなさい、という指示をHTTPヘッダに書けるようになっています。これをH2OなどのHTTP/2実装が認識するので、アプリケーションサーバがこういうヘッダを返せばプッシュするようになります。これにも問題があります。先ほど、アプリケーションサーバがリクエストを処理しているあいだにプッシュをしたい、と言いましたが、リクエストを処理中ということは、まだアプリケーションサーバがHTTPヘッダを送っていないわけですね。アプリケーションサーバがこのヘッダを送る前にプッシュをしたいわけです。いうことでどうやるか。これはWebサーバ側でやるしかないわけです。H2Oでは、アプリケーションサーバへリクエストを転送する前にmrubyハンドラでいったんリクエストをトラップして、Linkヘッダだけ先に書いてしまいます。するとプッシュが始まります。そのあとアプリケーションサーバにリクエストを転送します。することでアプリケーションサーバの処理中にプッシュが可能になります。キャッシュに入っている情報の送信を標準化議論中Webブラウザのキャッシュとプッシュの関係です。プッシュすればWebページの表示が早くなると言っても、Webブラウザのキャッシュに入っているものをわざわざプッシュしたくないわけです。そのためにはWebサーバがWebブラウザのキャッシュに何が入っているのか知りたいのですが、プッシュする段階ではまだHTTPヘッダが届いていないので、判断のしようがないわけです。server-push」です。これはブラウザキャッシュ内のCSS、JavaScriptの一覧のフィンガープリントを圧縮して、すべてのブラウザからのリクエストにcookieとして添付します。H2Oはそれを基にプッシュを行うかを判定します。キャッシュに何が入っているかはブラウザ以外には正確に分かりません。理想的にはWebブラウザがfingerprintを送信すべきなので、それは標準化しないとできないよね、ということで、現在IETFで標準化を議論中です。20165カ月でAngularJSとTypeScriptでSPAを開発。2016強いチームを作るには時間がかかる~強いチームのつくり方(前編)。2016レイテンシに負けないプロトコルとして登場したHTTP/2~奥一穂氏による「HTTPとサーバ技術の最新動向」(前編)。Japanがアジャイル開発の採用と改善で現場から変えた“サービスの作り方”(前編)。2016エンジニアを成長させるためのマネジメントと組織づくりとは~アドテクを中心とする組織の取り組みの例。ネットワークPublickey広告.NET帳票ツール。デザイナはExcel。クラウド/サーバー環境対応。.NET5/6/8に対応。デザイナはExcelのため、エンドユーザーも編集可能。ノーコードでCSVファイルから帳票を出力する、CSVReportも新収録。≫次の記事HTTPS化もHTTP/2にすれば負荷を下げられる~奥一穂氏による「HTTPとサーバ技術の最新動向」(後編)。2016≪前の記事レイテンシに負けないプロトコルとして登場したHTTP/2~奥一穂氏による「HTTPとサーバ技術の最新動向」(前編)。Niino(jniino)IT系の雑誌編集者、オンラインメディア発行人を経て独立。2009年にPublickeyを開始しました。Copilotが複数ファイルにわたるコード変更や生成に対応。CopilotがAppleのXcodeに対応。Xcode」パブリックプレビューOrbがデジタル通貨決済システムの基盤にNewSQLのTiDBを採用。ETLをなくし、トランザクション処理とデータ分析を統合可能に[PR]日本人プログラマ向け、プログラミングに適した「フォント」まとめ。2024年版GitHubで最も使われている言語、PythonがJavaScriptを抜いて1位に。生成AI関連プロジェクト急増で。Sonnetが選択可能に。100」の仮想マシンを正式提供開始JetBrains、JavaScript/TypeScriptのためのIDE「WebStorm」と.NETのためのIDE「Rider」、非商用利用ならば無償で利用可能に。