xai1981's blog

http://twitter.com/xai1981

HTTPレスポンスヘッダーの max-age

Web サービスでのキャッシュに泣かされた話

現象

プロフィールページで swf へ FlashVars で渡す値が更新されない
キャッシュしていそうな箇所は

  1. ブラウザキャッシュ
  2. Squid サーバーキャッシュ
  3. Smarty キャッシュ
  4. Propel キャッシュ

キャッシュ関連っていつも振り回されます

私の職場では

  • Production = 本番
  • Staging = 仮本番
  • Development = 共通開発環境
  • Personal = 個人開発環境

と4つの環境があります。

何か問題や意図しない動作を確認した際、まず疑わしいのは Personal で起きる動作と Development で起きる動作に差異があるため Personal 特有の不具合では?です。環境間で同じ動作が担保されてない状況でしたので Personal 特有の症状では、と疑う事からはじめてました。

以前はこの環境間での動作の差異が本当によくあったのです。この差異が頻繁に起きていたので、何が正しくて何が問題なのか、何が不具合で何が仕様なのか Personal で起きた問題をそのままチケットとして起票せず・できずに Development や Production で別途試すという二度手間がかかっていました。

しかし、新しいY社長のおかげで、色々見直されて、環境間の動作の際がほとんど起きなくなりました。他にも下記の仕組みが導入されました。

  • Trac の導入
  • Subversion コミット時にチケットとの完全同期
  • コミットフックによる、コメントの強制
  • コミットフックによる、コーディング規約の自動チェック

などなど、他にも盛りだくさん

Y社長の改革で仕組みを作るというのがどれほど大事かと思い知らされました。自分が会社を作るときは環境間での動作の差異だけではなくよりよい仕組みづくりを心がけようと思います。

ずれましたが、本題・結論です。HTTP レスポンスヘッダーの max-age に 300 秒の設定があったためブラウザが300秒間リクエストを行わず swf の FlashVars が更新されていませんでした。

Cache-Control: max-age=300, s-maxage=300, public

対応策としては有効な手法がみつからず、修正を見逃してもらいました。一度ブラウザにキャッシュしちゃったら、どうしようもない。

って上司に相談したら HTML をキャッシュするのは問題ない。ただ、変わる可能性があるデータであれば JavaScript で swf のロード後に取得すれば良いのでは?とアドバイス頂き、なるほどな、と納得しました。