JavaScriptヘッダ定義

広告

2017年10月10日火曜日

ウェブのキャッシュとは何なのか

ウェブ界隈の話をしていると、よく「キャッシュを削除して」とか「キャッシュが効くから早い」とかいう話を聞くと思います。キャッシュというのがどういう仕組なのか、どうやったら活用できるのかを少し説明していこうと思います。
まず、ブラウザでウェブサイトにアクセスできている仕組みを簡単に解説します。
ブラウザのアドレスバーに URL を(例えば http://blog.kilojapan.com/2016/02/blog-post_7.html)入れると、DNS という仕組みを使って blog.kilojapan.com を管理しているサーバを特定し、そのサーバに対して blog.kilojapan.com/2016/02/blog-post_7.html の内容を返すようにリクエストを行います。リクエストを受けたサーバは、何らかの方法で回答するコンテンツを決定し、返答します。もともとウェブができた頃は、URL とサーバ上のディレクトリ(フォルダ)構造が1対1対応している場合が多くありました。今回の場合、サーバのとあるディレクトリの中にある 2016 というディレクトリの中の 02 というディレクトリの中にある blog-post_7.html というファイルを返していました。最近ではよりインタラクティブなユーザ体験を実現するために、リクエストされた URL などを引数として動的にコンテンツを生成して返す場合が多いです。例えば検索キーワードに対して一覧ページを返す場合など、事前に静的にページを作っておくのは不可能ですが、リクエストに対して動的にプログラムを実行してコンテンツを生成することにより、これが可能になっています。帰ってきた HTML を、ブラウザが解釈して人が見やすい形式にして表示します。
基本的にはサーバは受け付けたリクエストを一つ一つ処理して、順番にコンテンツを返します。パソコンでブラウザのウィンドウをたくさん開きすぎると動作が重くなるように、サーバも処理できる量には限界があります。いわゆるバズったときには、この限界を超えたリクエストがサーバに送られ、結果的にサイトが見れなくなったり、表示が遅くなったりします。
ブログのコンテンツを返す場合など、一度記事ができてしまったら更新されない場合では、いちいちサーバがリクエストを処理するのは処理能力の無駄遣いになります。このためにサーバはコンテンツを返す際にコンテンツとは別にヘッダに「いつまでは内容を更新するつもりはないので、今回の結果はキャッシュをし、今後はリクエストを繰り返さないでください」という情報も含めて返します。
この情報はブラウザが解釈して利用することができます。ブラウザは次に同じ URL をサーバにリクエストするために、キャッシュの有効期限内かを確認し、これを利用しようと試みます。
ブラウザに加え、このサーバへのリクエストを中継していたサーバも、このヘッダ情報をもとにコンテンツをキャッシュすることができます。このブログは Google の Blogger というサービスを利用していますが、Google 製品へのリクエストは、基本的に Google が持っている巨大なキャッシュサーバを経由します。これにより Blogger のサーバがいちいちリクエストを処理することなく、Google の高速なキャッシュサーバからのデータをキャッシュサーバが直接ブラウザへ返答するということが可能になります。
サーバ上のプログラムのバグが修正された場合など、キャッシュを利用してしまうと古い情報がブラウザで見れてしまうことがあります。このときブラウザのキャッシュを削除すると、必ず新たにサーバにリクエストを行うようになるため、問題が解決することがあります。変更される可能性があるコンテンツの場合は、一般にキャッシュはせいぜい数時間程度にしか設定しないので、明示的にキャッシュをクリアしなくても次の日には問題が解決していることがありますが、こういう仕組みです。
このように、キャッシュをうまく利用するとサーバにコストを掛けなくても、バズった時にも落ちないサイトを運用することが可能になります。キャッシュサーバを新たに立てるのは結構面倒くさいですが、Google App Engine を使えば自動的に Google のキャッシュサーバを利用することが可能です。オートスケール機能と合わせて利用すれば、大規模なサイトを安定して運用することが可能になります。
ヘッダー画像引用:Google Cloud Platform

0 件のコメント :

コメントを投稿

広告