Thread Abort and High Availability

引き続き『Kazzzの「JとNの狭間で」』より.

一般的な、Javaサーブレットコンテナは、上がってくるHTTPリクエストに対して生のスレッド、又はスレッドプールからのスレッド(以降Webスレッド)を割り当てて、serviceを起動していく実装になっていると思うが、この時にWebスレッドの処理がシステムから見て、我慢できない程に時間が掛っていたり、負荷が高かったりしていることを検知して、Webスレッドで実行されている処理を異常終了させる、標準的な方法って無いんだろうか。

さすが、トランザクションモニタの雄Tuxedoをだしてるベンダだしな、と納得した。しかし、実行スレッドの「スタック状態」を検出するところは、もろ期待通りなのだが、サーバ全体のステータスを変えるというのはちょっと違う。スレッドがスタックしたことを一定の閾値で検出したならば、そのスレッドのみを殺して欲しいのだ。

この機能、特にJavaのようにスレッドプールを多用しているサーバでは非常に重要だと思うのだが、そうではないのだろうか。

.NET 界隈の話としては,以前 arton さんのところでちょこっと書いたこの辺かな.
http://arton.no-ip.info/diary/20051207.html#c01
以下の MSDN の記事 (上が邦訳で下が原文) が秀逸.

.NET Framework の信頼性機能でコードを実行し続ける
https://www.microsoft.com/japan/msdn/msdnmag/issues/05/10/Reliability/default.aspx
Keep Your Code Running with the Reliability Features of the .NET Framework
http://msdn.microsoft.com/msdnmag/issues/05/10/Reliability/

この中で出てきているユースケースはこんな感じでしょうか.

  • ここで非同期例外が発生した場合の回復処理が大変なんだけど,非同期例外の発生箇所を事前か事後に移動できないかな?
  • この処理を実行中のスレッドをアボートしちゃうと明らかにプロセス全体がクラッシュするんだけど,それをシステムに伝えられない?
  • このアンマネージドリソースは例えスレッドがアボートされてもリークしたらまずいんだけど,どうしたら確実に解放できるかな?
  • スレッドアボートを指示して 5 秒待っても終了処理が完了しなければ問題を格上げしたいんだけど出来る?