アプリケーション層でのキャッシュについて

SQLでN+1している処理とか遅い処理を隠蔽するためにアプリケーション層でキャッシュを使ってしまうことがよくある(ユビレジの話ではない)んですがこれが本当にだめ。

この実装をしてしまうと

  • モニタリングツールで遅いリクエストとして認知できる時はキャッシュが切れた時だけになり、不定期に一瞬負荷が高くなる原因不明の不具合を抱えたオカルトソフトウェアになってしまう
  • キャパシティ予測が立てにくく過剰に見積もる必要がある
  • キャッシュを無効にする実装に対するテストを書く必要があり、実装が複雑になりがち
    • リストのキャッシュに対してlike処理とか即時反映系を組み込もうとするとどんどん複雑になる
  • キャッシュが絡んだ不具合の再現が難しい

書き込みと参照が限定的なリソースになら、キャッシュを使っても悪影響は少ないとは思うんですが、別にそこホットスポットじゃなくない?