トラブル事例
「第1回:Javaで重要なことは開発ではない?」では障害対応について、「第2回:障害発生を考えていますか?」では障害発生時にありがちな事例と対処法について説明しました。今回はクライアントPCなど、システム利用環境で発生しがちなトラブル事例についての対処法を解説します。
実際にお客様のシステムで発生した障害において、次のような経験はないでしょうか。
- Webアプリケーションのシステムをリリースする直前、お客様から「Aという画面で、B操作とC操作をしたのに、ずっとB操作の内容が表示される」という連絡を受ける
- 連絡を受け、テスト環境で同じ操作を行っても正しく動作してしまう
- またログを調査すると、サーバ環境にはC操作のログが残っていなかった
原因はWebコンテンツのキャッシュ
このトラブル事例の原因は「Webコンテンツのキャッシュ」です。Webコンテンツのキャッシュは表2のような効果があり、アクセスのたびに変更がないコンテンツに対しては、非常に有用な機能となります。
- サーバやネットワークなど、システムの負荷削減
- 素早い画面表示(応答時間の短縮)
しかし、Webアプリケーションのシステムのように、アクセスのたびにコンテンツが変わる場合は、逆に悪影響をおよぼします。特に、最近よくみられ るAjaxを採用したシステムは、画面でマウス操作やキーボード操作をするたびにコンテンツが変わるため、Webコンテンツのキャッシュが悪影響をおよぼ してしまいます。
Webコンテンツのキャッシュが悪影響をおよぼす理由
ここでは図1のような画面遷移をするシンプルなWebアプリケーション例に、悪影響をおよぼす理由について解説します。

図1:Webアプリケーションの例
「1.検索キーワード入力画面」にて、利用者は検索キーワードを入力し、検索ボタンを押します。システムは入力したキーワードをもとに商品を検索し、「2.商品検索結果表示画面」を表示します。
このとき、「X」というキーワードで商品検索すると、「X」というキーワードの「2.商品検索結果表示画面」について、「http://www.sample.jp/resultのキャッシュ」として保存されます。次に「Y」というキーワードで商品検索すると、先ほど保存した「http://www.sample.jp/resultのキャッシュ」を使用し、商品検索結果画面を表示します。その結果、「Y」というキーワー ドの商品検索結果画面が表示されません。
キャッシュ機能を持つ機器
では、キャッシュ機能はどこにあるのでしょうか。Webブラウザが動作するクライアントPCからコンテンツを提供するサーバまでのネットワークをたどることで、キャッシュ機能を持つ機器をあげてみましょう。
社内ネットワークを利用する場合は図2のように、「クライアントPCにあるWebブラウザ」「プロキシサーバ」「Webサーバ」「アプリケーションサーバ」の4箇所でキャッシュが行われることが考えられます。
また、社内ネットワークではなくインターネットを経由すると、さらに機器は増えます。突然のアクセス増加に備えて、キャッシュサーバを設置している ケースや、コンテンツデリバリネットワーク(CDN:Contents Delivery Network)のサービスを導入しているケースも考えられます。
キャッシュを制御する必要性
このように、ネットワークには様々な箇所にキャッシュ機能を持つ機器があります。対策としてはキャッシュ機能の無効化をすることです。しかし、現実としてすべての機器に対して対応できないことがあるでしょう。
また、画像ファイルやスタイルシートはアクセスのたびに変更することはほとんどありません。そのようなコンテンツはキャッシュ機能を使うべきでしょ う。キャッシュ機能を無効化すべきなのは、アクセスのたびに変更するコンテンツであり、コンテンツによって適切にキャッシュを制御すべきです。

