WEBサービスには、様々な箇所でキャッシュ(Cache)が用いられています。
どこでどのようなキャッシュが可能なのか、何をキャッシュさせるべきなのかについて、勉強することで、ハイパフォーマンスなWEBサービスを構築することができます。
参考にしてください。
どこでキャッシュできるの?
1. クライアントでキャッシュする
ブラウザにURLを入力するとHTTPリクエストがスタートします。
ブラウザではJavaScriptやCSSファイルは基本的にキャッシュされます。
他にも、Cookieやローカルストレージ/セションストレージをキャッシュとして用いるケースもあります。
モバイルの場合でしたら、モバイルのDBにキャッシュしておくなどもあります。
できるだけクライアントに近いところでキャッシュしたほうが、パフォーマンスは良くなります。その一番の場所がクライアントでのキャッシュになります。一方でクライアント側は、サービス側からは一番コントロールしずらい場所になりますので、キャッシュの破棄や更新方法については、しっかりと検討・実装しておく必要があります。
2. CDNキャッシュ
CDNで静的ファイルを配信します。CloudFrare, Akamai, CloudFrontなどが有名ですね。こちらは各エッジサーバーで配信コンテンツをキャシュして返すことにより、Originへのリクエストを減らして、パフォーマンスを上げています。
エッジサーバーでキャッシュされているので、CDNサービスはキャッシュを破棄するための仕組みを提供していますので、Originのコンテンツを変更した場合には、キャッシュの破棄に気を付けましょう。
3. API Gateway
最近はRestAPIを受け付けるときにGatewayを置いてリバースプロキシとして用いることが増えてきました。このAPI Gatewayでもキャッシュをすることができます。
4. WEBサーバー
API Gatewayを利用しなくても、WEBサーバーをAPサーバーの前段に置くことが多いですね。Nginxが有名です。APサーバーの前段に追いて、リバースプロキシサーバーとして使うことが最近は多いのではないかと思いますが、Webサーバーの段階でもキャッシュすることが可能です。
5. APサーバーのメモリやHDD
アプリ層です。メモリにキャッシュしたり、ファイルにキャッシュしたりしてDBへのアクセスを減らすために用いられることが多いですね。あとはセッションキャッシュにも用いられます。
キャッシュというと、これしか知らない人も多いかもしれないです。アプリ開発しているとまず検討することになります。
6. キャッシュ用DB(Redis, Memcache)
DBへのアクセスを減らすために、キャッシュ専用にDBを構築することも多いですね。APサーバーがスケールアウトする前提の場合には、APサーバーでのキャッシュを使わずに、キャッシュ用DBを使うことも多いです。
7. DBサーバー
最後にDBです。一番システムのボトルネックになりやすい箇所です。パフォーマンス改善のためにまず検討するのは、DBアクセス部分です。
ここでエンジニアが何かを実装することはないでしょうが、DB自体もQueryの処理を高速化するために、クエリキャッシュの機能があります。この特性を理解してキャッシュされやすいようにQueryを工夫するというのも大事なことです。
キャッシュについて気をつけること
-
キャッシュの期間
どの程度の期間キャッシュが保持されるのか。TTLやExpiredなどの設定です。 -
キャッシュの更新
キャッシュをどのように更新するかということです。自分で実装することが多いですね。 -
キャッシュの破棄
キャッシュの保持期間を過ぎたら自動的に破棄されるケースもありますが、自前で破棄する方法を備えておくと、いざというときに約立ちます。
最後に
キャッシュはなくても動くようにしましょう!!!あくまでキャッシュです。
永続層として用いるのは危険です(そもそもメモリ上などの揮発しやすい場所に保存することも多いので)。
以上