cacheレイヤーとは? 遅いストレージの前に置く速いストレージ
cacheレイヤーは、頻繁にアクセスされるデータを高速なストレージに保存し、繰り返しの読み取りがデータベースやリモートAPIのような遅いソースを避けられるようにします。
cacheは、わずかな古さを大きな速度と引き換えにします。ホットなデータを、遅いソースの前にある高速なメモリに保つことで、cacheレイヤーはレイテンシを削り、記録の源泉への負荷を軽減します。有名な警句「コンピュータサイエンスで難しいものは二つだけ、cacheの無効化と名前付けだ」は、そのトレードオフのコストについてのものです。
cacheレイヤーの仕組み
読み取りはまずcacheを確認します。ヒットすれば、cacheされた値を高速に返します。ミスすれば、ソースから取得し、結果を保存して返します。頻繁に読まれ、めったに変わらないデータが最も恩恵を受けます。
得られるもの
- ホットな読み取りのより低いレイテンシ。
- データベースやupstreamサービスへの負荷の軽減。
- 読み取りの多いトラフィック下でのより高いスケーラビリティ。
- 読み取りのスパイクを吸収するバッファ。
無効化の問題
cacheは、ソースが変わった後に古いデータを提供しうります。戦略 (time-to-liveによる期限切れ、write-through、明示的な無効化) がその古さを管理します。誤った戦略を選ぶと、ユーザーに古いデータを与えるか、cacheの利点を消してしまうため、cacheのバグはここに集中します。
cacheと整合性
cacheはデータの二つ目のコピーを持ち込むため、小さな結果整合性の問題になります。テストや機能は、cacheが常に最新だと仮定するのではなく、cacheとソースが食い違う期間を許容しなければなりません。
buildパイプラインでのcache
同じ考えがCIを支えます。依存関係やbuildのcacheは高価な作業の結果を保存し、次の実行がそれをスキップできるようにします。どんなcacheとも同じく、古いまたは誤ったcache keyは微妙なバグを引き起こすため、cache keyは出力に影響するすべてを捉えなければなりません。
マネージドrunnerでのbuild cache
すべての依存関係を一から取得するコールドなパイプラインは遅くなります。Latchkeyのrunnerは、依存関係とlayerのcacheをウォームに保ち、繰り返しのbuildが毎回取り直す代わりに以前の作業を再利用できるようにします。
重要なポイント
- cacheレイヤーは、遅いソースの前にある高速なストレージにホットなデータを保ちます。
- その中心的な課題は無効化、すなわちある程度の古さを許すことのコストです。
- 同じcacheの考え方が、依存関係やlayerのcacheを介してCIのbuildを高速化します。