またもやnginx。
proxy_cache_lock on; にすると、キャッシングが有効な時、複数同時にnginxが受けたリクエストを束ねてひとつだけをバックエンドに転送してくれる。ということでonにしてみた。キャッシュが空の状態で ab -c 10 -n 30 とかやっても確かにバックエンドにはひとつしかリクエストが行かない。いいねーーー!
と、思ったのもつかの間。調子に乗ってabしてるとたまにリクエストを束ねてくれない時がある。少し試してみたところ、どうもキャッシュの有効期限が切れてnginxが内部的にパージ処理をしている時が怪しい気がする。
ソース読むかねぇ。。と思ってた所に proxy_cache_lock_timeout を設定するといいよと教えてもらい、設定してみたところきちんと束ねてくれるようになった。
追記: proxy_cache_use_stale updating; も必要みたい http://trac.nginx.org/nginx/ticket/130