Web配信の技術 ~キャッシュとは

新型コロナの影響もあり、SNS上で過剰在庫を買ってほしいといったECサイトの投稿を見かけるようになりました。実際に筆者もいくつか購入しました。ただ、SNSでの投稿が拡散されることにより急激にサイトを閲覧するユーザーが増え、過負荷のためにサイト自体が落ちて購入できない事態がしばしば見受けられました。筆者の場合は、翌日になってもサイトが落ちたまま繋がらず、購入を諦めたということもあります。

いわゆる巣ごもり需要もあり、以前にもましてWebサイトを落とさず安定して運用することは重要です。こういった過負荷については強靭なサーバーを用意するといった対策が思い浮かびますが、実は安定した運用のために欠かせないのが「配信」の技術です。

配信における改善の一つとして、CDNなどでHTTPキャッシュ(以下キャッシュ)を行い、負荷軽減を狙うサイトも増えてきました。

図1は、あるWebサイトがTV番組に取り上げられて急激なアクセスが来たときのリクエスト数のグラフです。このような大規模なアクセスに耐えられないサイトは少なくありませんが、この例ではキャッシュをうまく使いサイトがまるごと落ちることを避けられました。

図1 突入負荷
図1 突入負荷

キャッシュはこのような急激な流入の際、強い味方となります。効果が高い反面、事故を起こした時の被害が大きいのもキャッシュです。たとえば、設定ミスなどから、個人情報が流出するようなキャッシュ事故を起こしてしまうサイトも年に数回ニュースで見かけます。キャッシュ事故は本来他のユーザーに見せるべきでない情報をキャッシュ/配信してしまったために起きます。

配信の中で最も重要なポイントの一つ、キャッシュについて見ていきましょう。

キャッシュとはなにか

配信においてキャッシュとは、クライアント(ブラウザなど)や途中のサーバー(CDNやリバースプロキシ)にコンテンツのコピーを一定時間配置してかわりにレスポンスすることを指します。これによって、コンテンツの生成元(オリジンサーバー、オリジン)へのリクエストを減らし、負荷軽減が期待できます。

言い換えれば、コンテンツのコピーを用意して、Webサイト本体とは別の箇所からコピーを配るというような手法です。Webサイト本体がやることが減らせるため、サイトが落ちる事態を回避しやすくなります。

サーバーの負荷というとCPUが思い浮かびますが、CPUだけとは限りません。サーバーのなんらかの資源(リソース)を使うことを負荷と言います。たとえばサーバーごとの通信に使える帯域もそうです。スマートフォンのゲームのアセットは年々肥大化し、更新時に多くのクライアントが殺到するため通信量が100Gbpsを超えることもあります。これをオリジンだけで処理しようとすると帯域が枯渇して通信がままならないこともあるでしょう。CDNにキャッシュを置けば、本来オリジンで用意が必要だった100Gbpsをさばくのに必要なリソースをCDNに肩代わりさせることができます。これも負荷の軽減といえます。

どこにキャッシュを置くのかも重要です。キャッシュの配置する場所は3種類あり、それぞれで軽減できる負荷や特徴も異なります。うまく併用することが大事です図2⁠。

図2 そのままの配信/Proxyを使った配信/CDNを使った配信
図2 そのままの配信/Proxyを使った配信/CDNを使った配信

クライアントで行うキャッシュは自身のみで使い、他のクライアントとは共有しません。このため、クライアントが必ず1度はオリジンにリクエストする必要があります。少数なら問題になりませんが、1万、10万という多数のクライアントが来たら問題になります。大量のリクエストがオリジンにされるからです。

そこで重要になるのがリバースプロキシ(プロキシ、Proxy)やCDNです。Proxyはオリジンサーバーの前に設置し、キャッシュなどで負荷を軽減するためのサーバーです。CDNはContent Delivery Networkの略称で配信を最適化するために、分散した地域に配置されたサーバーやネットワークなどを指します。

CDN/Proxyはクライアントとオリジンの間(経路上)に配置されていて、クライアントにキャッシュがない状態でも、CDN/Proxyのキャッシュを活用できます。オリジンサーバーとクライアントの間に中継ポイントがあり、その中継ポイントがキャッシュ(画像やWebページ)を保持することで、オリジンサーバーまでいかなくても中継ポイントから高速にキャッシュを返せると考えてください図3⁠。

図3 効く場所
図3 効く場所

一般的にProxyはオリジンの至近に、CDNはクライアントに近い各地にサーバーが配置されます。CDNのサーバー(エッジサーバー)はより近い場所にあるため、より素早いレスポンスが期待できます。

キャッシュはどのような負荷を吸収し、どのような限界があるのか

なぜ、多数のアクセスが殺到するような環境ではCDNやProxyが有効なのでしょうか?

ユーザーの動きを考えてみましょう。先述の例だと「TVでサービスが紹介される⁠⁠→⁠視聴者がサービス名で検索を行いアクセスしてくる」という流れがあります。この流れだと、一般に検索で到達するページは同一です。そのため、そのページやそこからリンクでたどれるページをいくつかキャッシュできていれば、突入負荷の大部分をキャッシュで吸収可能です。

この流れはなにもTVに限った話ではありません。SNSで話題になるような場合も同じです。⁠リンク付きの投稿が話題になる⁠⁠→⁠見たユーザーがリンクを踏んでアクセスしてくる」という流れなら、やはりそのリンクのページや関連ページがキャッシュできれば突入負荷を吸収できます。

キャッシュさえあれば負荷対策として万全なのかというとそうではありません。サイトにはどうしてもキャッシュができないようなページがあります。マイページのように複数人で共有できないページが代表例でしょう。

キャッシュだけではどうにもならないときは、システムのスケールアウト(強化)が必要です。キャッシュを行うことで、オリジンに到達するリクエストは緩やかになっているため、スケールアウトに必要な時間が確保しやすくなります。

キャッシュをうまく使おう

キャッシュはうまく使えば強力な武器となり、粗雑に扱えば牙をむきます。また、万能ではなく、キャッシュできないリクエストが増えた際やキャッシュが消えた際の対応も考えないといけません。

これまでに書籍やWebサイトではキャッシュを有効活用しようあるいはCDNを使おうという記述はあっても、どのように考えて使えばいいかまでは踏み込んで解説されていませんでした。Web配信の技術では、キャッシュはもちろん、配信全般について考え方から学べます。しくみや課題などを全般的に解説しています。

Webシステムはさまざまなキャッシュを利用して動いており、本来開発者にとってキャッシュは身近なものです。ところが、キャッシュの中でも、重要なProxy/CDNやブラウザでのキャッシュが意外と考慮から漏れがちです。

本書がこういった風潮に一石を投じ、HTTPキャッシュ、Proxy、CDNの正しい導入の力となれればと思います。

田中祥平(たなかしょうへい)

(いわなちゃん/xcir)
GREEで配信周りを引き受けるエンジニア。
配信全体に強く,特にVarnishに詳しい。
自社の大規模配信に加え,他社の中小規模サービスにアドバイザーとしても参加。幅広い経験を持つ。