@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

Webサービスのスレッドについて

1
投稿者投稿内容
だんご虫
会議室デビュー日: 2006/07/30
投稿数: 18
投稿日時: 2007-05-08 17:27
いつもお世話になっております。
だんご虫です。

Webサービスのスレッドについて質問させてください。


クライアント         Webサーバー        DBサーバー
Winアプ     <-->   Webサービス   <-->   DB(SqlServer2000)


以上のようなシステムにおいて、
WinアプリとWebサービスを同期通信で行っていたのですが、
ある集計処理を実行したところ非常に時間がかかってしまい、
同期通信ではよろしくないという事になりました。
そこで、WinアプリとWebサービスを非同期通信に変更し、
DBに集計処理の状態テーブルを作成し、一定間隔でその状態テーブルを参照し、
集計処理の終了を捕らえるようにしました。

処理の流れは以下の通りです。
@WinアプリからWebサービスへ集計処理を要求
A要求を受けたWebサービスはスレッドを作成し、直ちに応答をクライアントへ返す。
Bクライアントは一定間隔で集計処理の状態テーブルを参照し、処理が終了しているかを確認し続ける
C作成されたWebサービスのスレッド内では、DBサーバへ集計を要求
 DBサーバーの集計が終了したら状態テーブルを終了にする。
Dクライアントは状態テーブルが終了となっていた場合、集計結果のデータをWebサービスへ要求し得る

ここから質問です。
集計処理を強制終了させる必要があった場合、
Webサービスで実行中のスレッドをクライアントがWebサービスに対して終了要求をして、
終了させるにはどのように行えばよいのでしょうか?
ご教授お願い致します。

なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-05-08 22:28
引用:

だんご虫さんの書き込み (2007-05-08 17:27) より:
WinアプリとWebサービスを同期通信で行っていたのですが、
ある集計処理を実行したところ非常に時間がかかってしまい、
同期通信ではよろしくないという事になりました。


このよろしくない理由はなんだったんでしょうか?
リクエストの処理に長時間かかってしまうこと(つまりサーバ側のリソースの問題)なのか、
呼び出し側のクライアントの動作が理由かどちらでしょうか?
※クライアント側の問題なら、呼び出しを非同期にすれば済む話だと思われるからです。
 まあ続きを読んでみてると多、分サーバ側の問題なのでしょうけど。

引用:

そこで、WinアプリとWebサービスを非同期通信に変更し、
DBに集計処理の状態テーブルを作成し、一定間隔でその状態テーブルを参照し、
集計処理の終了を捕らえるようにしました。

処理の流れは以下の通りです。
@WinアプリからWebサービスへ集計処理を要求
A要求を受けたWebサービスはスレッドを作成し、直ちに応答をクライアントへ返す。
Bクライアントは一定間隔で集計処理の状態テーブルを参照し、処理が終了しているかを確認し続ける
C作成されたWebサービスのスレッド内では、DBサーバへ集計を要求
 DBサーバーの集計が終了したら状態テーブルを終了にする。
Dクライアントは状態テーブルが終了となっていた場合、集計結果のデータをWebサービスへ要求し得る

ここから質問です。
集計処理を強制終了させる必要があった場合、
Webサービスで実行中のスレッドをクライアントがWebサービスに対して終了要求をして、
終了させるにはどのように行えばよいのでしょうか?
ご教授お願い致します。


これを見た限りでは、長時間かかる処理そのものはDBが実行しているのですよね?
つまり本当にキャンセルする必要があるのはDB側の処理のはずです。
スレッドだけを強制的に終了させても、本当は問題が残るのではありませんか?

また、仮にいろいろ小細工をして対象スレッドを強制終了しようとしたとしても、
DBアクセスでアンマネージ処理を実行している間はとりあえずスレッドは終了できません。
なので、結局DB処理から返ってくるまで強制終了は待たされることになります。
※タイムアウトは合ったかもしれませんが。

また、Webサーバを分散している場合などは、中止のリクエストが異なるサーバに
届くかもしれませんので、これらを考慮する必要があります。

というように、おそらくあまりうまく行くやり方ではありません。


例えばDBに中止要求を示す情報を登録できるようにして、DB側の長時間処理内で
適度にチェックを行い、自ら中止できるようにしておく方がよいと思います。

Webサーバにて別スレッドで処理を起動するのも、ワーカープロセスのリサイクル
なんかの可能性を考えると、なんとなく怖い気がします。

本当なら、非同期処理方式でWebサービスを実装し、DB処理の呼び出しを非同期で
行うのがもっとも望ましい気がしますが、これを実装するのはちょっと面倒
かもしれないですね…
だんご虫
会議室デビュー日: 2006/07/30
投稿数: 18
投稿日時: 2007-05-09 17:11
なちゃ様、御回答ありがとうございます。

なちゃ様のおっしゃる通り、よく考えたら、
スレッドだけを止めても意味がありませんね。
ストアドの中に中止要求に応じる処理を埋め込まなければ駄目ですね。

工数を考えると頭が痛いです・・・
1

スキルアップ/キャリアアップ(JOB@IT)