パスとファイルが一致しない場合の実装技術
前ページ(notfile.md
)では、HTTPリクエストとファイルの関係が必ずしも1対1ではないことを説明しました。
このページでは、ファイルが存在しない場合の動的処理について、具体的な実装技術とパフォーマンス課題を扱います。
動的コンテンツ生成の課題
現代のWebページ(Webアプリケーション)は、静的なHTMLはもちろんありますが、かなりの部分が動的に生成されたものとなっています。 それだけ利用者の情報(アカウントやアカウントに紐付けられた個人情報、その他の関連事項)に応じた個別化(パーソナライズ)されたものが求められるようになっています。
動的生成の利点と問題点
利点:
ユーザーのアクセスに応じたページ生成により、利用者にとって必要な情報へ行き着きやすくなる(もしくは誘導できる)
商売のページであれば、購買行動に繋がるようになっていれば成功
問題点:
都度ページを生成するという行為は、サーバーに対する負荷という部分で問題が生じる可能性がある
多くのリクエストに同時並行して対応する必要があり、サーバーの負荷が非常に高くなることもある
テンプレートエンジンによる実装
そのため『静的に生成できる部分』と『動的に生成する部分』をきちんと分離し、適切な処理を行う必要があります。
さらにサイトとしてのレイアウト(体裁)も維持する必要が生じます。
そこで動的サイト生成のシステムでは、一般に『テンプレートエンジン』と呼ばれる仕組みを導入します。
以下の例はPythonで実装されているライブラリJinja2の例です。HTMLの中に、 {%
と %}
で囲まれた制御構文、 {{
と }}
で囲まれた変数埋め込みを行うことができます。
{% if user.is_authenticated %}
<p>Welcome, {{ user.username }}!</p>
{% else %}
<p>Please log in.</p>
{% endif %}
ざっくり見るだけでも、ユーザーが認証されているかどうかで表示内容を変えたり、ユーザー名を埋め込んだりできることがわかります。
パフォーマンスへの影響
当然このようなテンプレートエンジンを使うには、サーバー側でテンプレートエンジンを保有する必要があり、リクエストの中で都度使っていく必要が生じます。その分少量でもサーバーへの負荷が増大することになります。 もし人気のあるサイトとなってしまえば、非常に多くのリクエストに同時並行して対応する必要があり、サーバーの負荷が非常に高くなることもあります。 コストが許すのであれば、サーバー(インスタンス)の性能を引き上げたり、サーバーを増やして分散するなどの対応も必要になることでしょう。
動的APIサーバーの事例
同様の事例は、オンラインゲームのAPIサーバーも該当するでしょう。こちらはむしろ多くが動的なデータとなります。各ユーザーからの情報を集約し、必要に応じて処理したデータをユーザーに返していくことが常時行われていきます。 当然一定の性能が保持できないと、利用者側にとっては遅延といった形で不利益が生じる可能性も出てきます。どれぐらいの性能のサーバーを持たせるべきかなどをαテスター、βテスター達の意見を参考にして、負荷試験を行いながら決定していくことになるでしょう。
SSGによる負荷低減
もしそこまで個人ごとのパーソナライズが必要が無いという状況であれば、SSG(Static Site Generator; 静的サイトジェネレーター)を用いることも検討できます。 たとえばブログのサイトであれば、従来はリクエストに応じた動的レンダリング(WordpressやMovableType)が主流です。しかし、最近ではSSGを用いて事前に静的なHTMLに変換することで、サーバー側は単純にファイルを返すだけで済むようになって負荷が大幅に低減します。
ただし、完全に静的になるとユーザーが離脱する恐れがあるため、動的な処理をJavaScriptで補っていることも多いです。
外枠(レイアウト)は静的に生成
内部コンテンツを断片化して静的に生成
ブラウザには外枠と内部コンテンツの組み合わせを行うJavaScriptを配信
ブラウザ側でのスクリプトにより、必要に応じて内部のコンテンツを送信し、レンダリングさせる
こうやって見ると、サーバー側が全てを負担するというよりは、クライアント側にも負担をさせている(分散させている)という風に見ることもできますね。
注釈
もちろん静的サイト生成を行うというコストは発生します。 ただしこれは一度だけ行えば良く、なんなら生成処理自体はバックグラウンドで(指定の〆切りまでに)行えればそれでかまいません。 よって、サーバー自体の負荷としてはかなりマシな話となります。
注釈
ブログサイトなんかでは、広告部分やアクセス解析のツールをJavaScriptを用いて読み込ませるという方法を取り、配信しているサイト自体はできる限り静的にしていることが多いです。 その結果、サーバーの負荷が大幅に低減され、コストも抑えられています。