一般的なキャッシュ戦略
キャッシング戦略を実装する際に必要な重要な選択がわかったところで、よく使われるキャッシング・パターンをいくつかおさらいしておきましょう。それぞれのパターンについて、そのパターン、上記の3つの質問に対するそのパターンの選択、そのパターンを使いたい場合について説明します。
ローカル・ブラウザ・キャッシング
最初の、そしておそらく最も単純なキャッシュ戦略は、ローカルブラウザキャッシュです。ブラウザからアクセスするウェブベースのアプリケーションを構築している場合、ローカルストレージを使用して、ユーザーのブラウザにキーバリューのデータを保存することができます。例えば、一旦ユーザーがあなたのサービスに認証されると、その後の閲覧時にアプリケーションの表示を高速化するために、サービスにアクセスするために使用されたユーザーのIDとプロファイルに関するいくつかの情報を保存することができます。
ローカルブラウザのキャッシュは、ローカル、サイドキャッシュであり、おそらく読み取り時に書き込まれます。
ローカルブラウザキャッシュの利点は、ローカルストレージAPIが最新のウェブブラウザに含まれているため、シンプルであることです。さらに、データをキャッシュするためにユーザーのマシン上のスペースを事実上貸し出しているため、事前にキャッシュをプロビジョニングしたり、容量不足を心配する必要がありません。
ローカル・ブラウザー・キャッシュの欠点は、特定の状況でしか使えないことです。ユーザーがブラウザを再利用する場合、特定の操作を簡単にスピードアップできます。しかし、キャッシュされたデータは、異なるデバイスを使用している時、あるいはデバイス上で異なるブラウザインスタンスを使用している時でさえ、ユーザーには適用されません。さらに、基礎となるデータが変更された場合、バックエンドのデータソースがローカル・ストレージ・キャッシュのアイテムをプロアクティブに無効にするメカニズムはありません。
ローカル・バックエンド・キャッシング
2つ目のキャッシュ戦略は、もう1つのローカル戦略です。ローカル・バックエンド・キャッシングでは、バックエンド・サーバー・インスタンスはネットワーク・レスポンスや他のシステムからの中間データをキャッシュすることができます。このデータは多くの場合、プログラミング言語のキー・バリュー・マップのように、アプリケーション・プロセス内でイン・メモリでキャッシュされます。バックエンドインスタンスがそのデータにアクセスする必要がある場合、まずインメモリオブジェクトをチェックし、キャッシュされた値が存在しない場合はプライマリデータソースにフォールバックします。
ブラウザのローカル・キャッシングと同様、これはローカル、サイドのキャッシング戦略であり、読み込み時に書き込まれる可能性が高いと言えます。
この戦略の利点は、使いやすさとシンプルさにあります。頻繁にアクセスされ、比較的寿命の長いデータがある場合、追加のインフラを立ち上げて運用することなく、個々のサーバーインスタンスに素早くキャッシュすることができます。これは、設定データなど動きの遅いデータには効果的です。
このキャッシュ戦略の欠点は、リモート・キャッシング手法よりも効果が低いことです。各バックエンドインスタンスはそれぞれ独立したキャッシュを持つことになります。キャッシュするデータセットが幅広く、そのインスタンスで一度リクエストされたものだけをキャッシュする場合、キャッシュのヒット率はかなり低くなります。さらに、クラスタ・サイズ(そしておそらく全体的な負荷)が大きくなると、キャッシュ・ヒット率はさらに低くなります!これは、AWS Lambdaのような、インスタンスが定期的に生成・破棄されるハイパーエフェメラルなコンピュートでキャッシュする場合に特に厄介です。最後に、ローカルブラウザのキャッシュと同様に、基礎となるデータが変更された場合、バックエンドインスタンスで期限切れのデータを無効にするのは難しいかもしれません。
リード・アサイド・キャッシング
3番目の、そして最も一般的なキャッシング戦略は、リード・アサイド・キャッシング(一般に「遅延ロード」と呼ばれる)です。リード・アサイド・キャッシングでは、アプリケーションはまずキャッシュから必要なデータを要求しようとします。もしデータがあれば、呼び出し元に返します。もしデータがなければ、プライマリー・データ・ソースにデータを要求します。そして、次のリクエストのためにキャッシュにデータを保存し、呼び出し元にデータを返します。
これは、リモート、読み取りベース、サイドのキャッシュ戦略です。
リード・アサイド・キャッシング戦略の利点は、キャッシュ・ヒット率の向上と、ほとんどの問題への汎用性にあります。ほとんどのアクセスパターンにおいて、一度アクセスされたデータ片は、その後すぐに再びアクセスされる可能性が高いと言えます。データの一部が読み込まれた後、一元化された場所にキャッシュすることで、サーバー群全体のキャッシュヒット率を向上させることができます。さらに、リード・アサイド・キャッシュ戦略は、ほぼすべての状況に適用できます。ネットワーク・レスポンス、中間計算の後、HTTPクライアントへの完全な集約レスポンスなどが代表的な例です。
ローカルキャッシュからリモートキャッシュに移行することで、ヒット率は上がりますが、運用の負担が増え、アプリケーションの複雑さも増します。管理すべきインフラが増え、システム全体の可用性への影響も考慮しなければなりません。プライマリ・データ・ソースにフォールバックするので可用性に影響はないと思うかもしれないが、多くの停止は、プライマリ・データ・ソースへの持続不可能な負荷につながる初期キャッシュ障害が原因です。
さらに、リード・アサイド・キャッシュは、データ の最初の読み取りに対してレイテンシ・コストを支払います。アプリケーションの読み取りがアプリケーション内のレコードに分散している場合、キャッシュがほぼ満杯になり、全体的にキャッシュヒット率が低くなる可能性があります。