Varnishによる動的コンテンツのキャッシュ

Velocity 2009のTwitterのスライドを見ていて、何点か面白いなぁと思った物があったのですが、その一つがVarnishのESIによる動的コンテンツのキャッシュでした。ApacheとApp Serverの間にVarnishをはさんで、動的コンテンツをキャッシュするというものです。

Velocity2009のTwitter
http://assets.en.oreilly.com/1/event/29/Fixing%20Twitter_%20Improving%20the%20Performance%20and%20Scalability%20of%20the%20World%27s%20Most%20Popular%20Micro-blogging%20Site%20Presentation.pdf

自分がこれに似た話を聞いたのは、Livedoorの技術セミナー(LD Blogのアーキテクチャについて)できいたhidedenのmod_ssiの話と、ニコニコ大百科でJSで動的部分を構築するって話だった気がします。当時、これはなかなか面白い仕組みだなぁと思ったのでした。

いかに、動的部分のページ構築をApp Serverにリクエストを飛ばさずに構築できるのかというところがポイントで、そのためにVarnishのESIを使っています。要するに、「App Serverに届いたら負け」というのを忠実に実践していると。

ESIについてですが、Twitterのスライドでは1行でさらりと書いてあります。

 Using ESI to cache jQuery requests when specifying a callback= parameter - big win

動的ページの部分キャッシュに関しては、ページの部分キャッシュの説明ですが以下のスライドがとてもわかりやすく書かれていました。
http://www.scribd.com/doc/3188436/Assembling-Pages-Last-Edge-Caching-ESI-and-Rails

vclの記述力が高いのと、ESIもかなり簡単にかけるようになっているので、これは色々と活用できる点があるだろうなぁと思ったのでした。

Twitterのスライドには、Searchの用途で検索クエリーの結果のキャッシュって話も書いてあるのですが、vclの記述力が高いので、これもいいでしょうね。
varnishのIntroductionページとConfigurationExampleのページをみれば、簡単に実現できるのがわかります。
http://varnish.projects.linpro.no/wiki/Introduction

vclの記述は柔軟性があるので、いわゆるページキャッシュは、Varnishにさせるというのは、かなりよさそうですね。App Serverの負荷がへるだけでく、アプリケーション側でページキャッシュを面倒見る必要がなくなるのでコードもシンプルになりいいことずくめな気がします。ページキャッシュをmemcachedにつっこめるようになれば、応用範囲はかなり広がりそうです。そこらはvclでも書けそうなので、少し調べてみたいですね。

See also

Velocity2009全体に関しては、naoyaさんの以下の記事がすばらしくよくまとまっています。
http://www.sssg.org/blogs/naoya/archives/1398