Railsでページキャッシュ( page caching )を使うべきでない理由

Rails4からはページキャッシュとアクションキャッシュが標準から除かれて外部のgemになりました(参考: [Rails 高速化] ページキャッシュ、N+1対策、SQLチューニング - 酒と泪とRubyとRailsと)。

アクションキャッシュはなんとなく中途半端で使いどころも難しそうな感じだったので理解できるのですが、ページキャッシュまで除かれちゃったのはどうしてなのかなと色々調べていたら、以下の記事が良い感じにまとまっていました。

Page and Action Caching Gem Extraction [Rails 4 Countdown to 2013] | The Remarkable Labs Blog

要約すると

  • sweepersとかobserversとか手動でexpirationの管理が必要で煩雑
  • アプリをスケーリングさせようとしたときにその煩雑さがネックになる
  • ページキャッシュを使うとページ要素が全て静的になる。それならmiddlemanでも使えばいい
  • ステートレスなキャッシングはVarnishとかのreverse proxyが負うべき役割だろう

expirationの管理については、コメント欄でも突っ込まれているようにmemcachedのexpired_atを使う方法などもありそうなところですが、そもそもページレベルでのキャッシュがRailsがカバーすべきところなのかという点については個人的に同意できるところです。ちょっとレイヤーが違うというか、スマートさに欠ける気がしなくもない感じなのです。

Rails4の方向性という意味ではturbolinksとの絡みなんかも考慮されたのかもしれませんね。

そうは言っても、実際にページキャッシュをうまく使えば10倍とかのレベルで速さが違ってきますので、例えば安サーバで運用される向きなどには程よい現実解として簡単には諦めきれないところもあるかと思います。上記の問題を理解したうえで、よく考えてキャッシュの範囲を決めるのが大事になるでしょう。