2

SQLServer2005データベースバックエンドを備えた複数のIIS6WebサーバーでASP.NETアプリケーションを実行しています。

する必要がある:

  1. 外部ジョブイベントの完了についてデータベースを監視してから、

  2. 正確に1つのWebアプリケーションインスタンスにいくつかの情報をWebサービスに送信させる

(1)の場合、SqlDependencyが最善のアプローチ(または単なる古いポーリング)のようです。各Webアプリケーションインスタンスは、起動時にそのような依存関係を登録します。(「マスター」インスタンスを構成したくないのは、そのインスタンスが失敗すると、他のインスタンスが使用可能であってもタスクが続行されないことを意味するためです。したがって、私の設計では、実行可能なインスタンスがあるかどうかを確認します。作業が終わったら、作業を進める必要があります。)

(2)については、次の行に沿って、(1)でSqlDependency通知を受信すると、Webアプリケーションインスタンスが更新しようとする何らかのフラグをデータベースに含めることを考えていました(非常に単純化されています)。

UPDATE StatusTable SET TaskStatus = 1 WHERE TaskStatus = 0

SELECT @@ROWCOUNT

TaskStatusを更新できるアプリケーションインスタンスは1つだけであるため、@@ ROWCOUNT> 0のインスタンスは1つだけです。これが、情報をWebサービスに送信するために「選択」されたインスタンスになります。

このアプローチの欠点は何ですか?私の他のオプションは何ですか?(注:この作業を行う別のサービスはオプションではありません。)

4

1 に答える 1

1

グローバルな「フラグ」は機能しません。複数のウェイターと複数の通知があることに注意してください。1人の「ウェイター」がすべての通知を受け取ることは望ましくありません。'正確に1つの'タスクを確実に選択するには、UPDATEとOUTPUTを使用します。

UPDATE TOP(1) StatusTable
   SET Status = 1
OUTPUT DELETED.TaskId
WHERE Status = 0;

これは、キューとして使用されるテーブルから行をデキューするための推奨される信頼性の高い方法です。OUTPUT句の「キュー」の段落を参照してください。

ただし、ここでは、1)テーブルをキューとして使用している2)これらのキューから通知を受信して​​いる、3)Service Brokerを使用してこれらの通知を配信している(内部でService Brokerを使用するSqlDependencyを介して)ことを理解する必要があります。では、単純なService Brokerだけを使用してみませんか?キューサービスが必要であり、各インスタンスがこのキュー(ポーリングではない)でWAITFOR(RECEIVE ...)を開始するようにします。関心のある仕事はSENDで仕事を終えますあなたのサービスに、仕事が完了したことを通知します。インスタンスの1つがこの通知を受け取り、後処理を続行します(つまり、Webサービス呼び出しを配信します)。このようにして、通知(SqlDependency、グローバルフラグ、キューとして使用されるテーブル)の周りのすべての「綿毛」を切り取り、とにかくSqlDependencyによって使用されるベアボーンインフラストラクチャに反対します。

于 2010-03-05T00:17:09.440 に答える