1

Web ファームがいつ作成されるか、先を見据えて...

電子メールの送信、ファイルのサムネイル化/処理など、さまざまなバックグラウンド タスクを実行するさまざまな Windows サービス アプリケーションがあります。

サーバー ファーム環境では、理論上は各マシンに各サービスをインストールして実行できますが、ビジネス オブジェクト ベースの「先書き優先」や望ましくないタスクの重複が原因で競合が発生する可能性があります。の回。

「先に書いたほうが勝つ」というシナリオは、問題を解決するか項目をスキップするコードまたはロジックによって克服できます。(基本的なキューイング メカニズム (クエリ リストとプロセス レコード) の場合は、再試行されます)

タスクを複製するために、トランザクションでタスクを実行して、他のプロセスが同じリソースを取得するのを防ぐことができますが、それらは単に待機するだけであり、再び発生したことに基づいてログインを処理する必要があると思いますか? これは当てはまりますか?

タスクの重複を防ぐために、起動する最初のサービスによって設定されるデータベースに「ロックフラグ」を書き込むメカニズムを構築することを考えています。このフラグは日付が付けられ、サービスのインスタンスを参照します。フラグを「所有」するサービスがタスクを実行し、この日付を定期的に更新します。また、サービスがフラグを所有していない状況では、各サービスにタイムアウト/許容度の設定があり、許容度をチェックし、必要に応じて引き継ぎます。

これは妥当な解決策のように聞こえますか?それとも、その段階でより優れたメッセージ キューイング ベースの解決策に進むべきですか?

テクノロジー: C# / ASP.NET / SQL Server

4

1 に答える 1

2

2つのメカニズムが考えられます。

  1. すべてのタスクがデータベース アクティビティから派生している場合は、新しい「タスク」テーブルを作成し、アクティビティにトリガーを設定して、タスク情報を含む新しいレコードが挿入されるようにすることができます。次に、Windows サービスは「タスク」テーブルをポーリングし、アトミックな選択および削除トランザクションを使用して、1 つのサービスだけがそれを行うようにします。

  2. メッセージ キューを使用してタスクをドロップし、Windows サービスにキューをポーリングさせることができます。キューに入れられた各メッセージは、単一のサービスによってのみデキューできるため、各タスクが 1 回だけ実行されるようにすることができます。もちろん、メッセージ キューの負荷について心配する必要があります。アプリケーションによっては、Amazon の Simple Queue Service のようなものを使用できます。これにより、信頼性とスケーラビリティについて心配する必要がなくなります。

于 2009-09-14T09:57:25.630 に答える