Metaがキャッシュ無効化を使いながらキャッシュ整合性を維持する方法(翻訳)
(moonsub-kim.github.io)Cache Inconsistency
cache serverが DB に x へのリクエストを送り、DB が x=42 を返した応答がcacheに到着する前に- 外部から x=43 に更新され、
invalidationを通じて x=43 がcacheに伝えられる cacheは x=43 を受け取って反映する- x=42 の応答が遅れて到着し、反映される
- 外部から x=43 に更新され、
- 上の問題は、データに
versionを付けることで解決可能 - しかし
versionを付けても、x=43 に対するevictionが起きると x=42 が反映されうる
Polaris: Cache Inconsistency 測定サービス
- 動作過程
- Polaris も
invalidation eventを受け取る eventを受け取ると、すべてのcache serverを確認して以前のversionを持っているか調べるcacheが以前のversionを持っていればinconsistencyと判断し、再試行できるようrequeueするinvalidation eventがcache serverに遅れて到着する可能性があるため
- 一定時間(1分、3分、5分など)が過ぎると
inconsistencyアラートを送る
- Polaris も
- metric
- 直近 M 分間において、N nines に相当する
cache writeが整合しているかを示すmetricを表示する - 5分間で 10 nines なら、直近 5 分間で 100 億件中 1 件の
cache writeがinconsistencyだと分かる
- 直近 M 分間において、N nines に相当する
Cache Inconsistency をデバッグするためのロギングライブラリ
- すべての
cache writeをロギングするのは不可能- そもそも
cacheはread-heavy workloadなのに、「ロギング」によってwrite-heavy workloadになってしまうため
- そもそも
- そのため、
invalidationが起きた直後のtime windowについてロギングできるようライブラリを作成 invalidationに関与するすべてのサービスにライブラリを組み込む- ロギングにより
inconsistencyが発生したとき、発生に至るまでの過程をtimelineとして把握できる
まだコメントはありません。