2011年3月28日月曜日

アプリケーションプールの役割

ちょっと技術的な話になるが、WindowsサーバーでWebサイトやWebアプリケーションを動かす場合、
標準の機能であるIISを利用する。

今まで普通に使っていたのだが、先日こんな問題が起きた。

Windows2003 + IIS6.0 + ASP + Oracle10g の組み合わせの業務システムでDBへ書き込む処理にバグがあり、
同じトランザクション内で同じレコードに書き込みが行われた。
そのため、Oracleでデッドロックがかかりそれ以後サイトAにアクセスできなくなってしまった。

もちろん、原因はASPの書き込み処理であるのだが、
この問題により同じサーバーに入っていた別サイトBも稼動しなくなってしまった。
サイトAの問題が、関係ないサイトBにも影響したことは非常に重大だ

以下がIISのアプリケーションプール構成である。
・アプリケーションプール1
ログイン
サイトA ←[emoji:v-190]問題発生
・アプリケーションプール2
サイトB

サイトA,Bは、アクセスするとログインを通る仕組みになっている。
そのためサイトBにアクセスするとログインに遷移。
ログイン処理でDBへアクセスした際、処理が止まってしまうようだ。

そもそも、Oracleでデッドロックが発生した場合、
再び同プロセスからアクセスすると待たされてしまうため処理が止まってしまう。
しかし、別プロセスからアクセスすれば処理は継続できるはずである。

今回の構成で問題だったは、
ログインとサイトAを同じアプリケーションプールに入っていたことだ。
同じアプリケーションプールの登録されたWebサイトは同じプロセス内で処理される。
ログインのような汎用的なものは、
固有のサイトの動作に依存してはいけないため独立したアプリケーションプールで動作させるべきであった。

今回の経験は、事前に限り影響の少ない構成を考えることの重要性を身をもって体感できた貴重な経験になった。
必ず今後に生かそうと思う。

0 件のコメント:

コメントを投稿