1

バックエンド処理のためにキューに入れられる「作業項目」を生成するシステムを構築しています。私は最近、同じ要件を持つシステムを完成させ、最適とは思えないアーキテクチャを思いついたので、この新しいシステムについてのアドバイスを期待していました。

作業項目は一元的にキューに入れられ、基本的にFIFOの順序で処理する必要があります。これが唯一の要件である場合、私はおそらくMSMQまたはSQLServerサービスブローカーソリューションを好むでしょう。ただし、実際には、変更されたFIFO順序で作業項目を選択する必要があります。作業項目にはいくつかの属性があり、属性値の特定の組み合わせが存在する場合は、FIFO順に割り当てる必要があります。

例として、作業項目には、Office、Priority、Group Number、およびSequence Number(グループ内)の属性があります。複数のアイテムが同じグループ番号でキューに入れられる場合、それらはシーケンス番号の順序でキューに入れられることが保証され、同じ優先順位を持ちます。

特定のサービスの特定の構成パラメーターを指定して、変更されたFIFO順序で作業時間をプルするいくつかのバックエンドプロセス(現在はWindowsサービスとして実装されています)があります。ワシントンDCを実行しているサービスは、DCの作業項目のみを処理するように構成されていますが、NYのサービスは、NYとDCの両方の項目を処理するように構成されている場合があります(主に全体的なスループットを向上させるため)。このタイプの選択性に加えて、優先度の高いアイテムを最初に処理し、同じ「グループ番号」を含むアイテムをシーケンス番号の順序で処理する必要があります。したがって、NYサービスがシーケンス1のグループ100のDCアイテムを処理している場合、シーケンス1はまだ完了していないため、DCサービスがグループ100のシーケンス2のDCアイテムをプルオフすることは望ましくありません。他のグループのアイテムは、引き続き処理の対象となる必要があります。

最後のシステムでは、SQLテーブルを使用してキューを実装しました。アイテムを送信し、さらに重要なことに、アイテムの処理を担当するWindowsサービスにアイテムを「割り当てる」ためのストアドプロシージャを作成しました。割り当てストアドプロシージャには、上記で説明した選択ロジックが含まれています。各Windowsサービスは、割り当てストアドプロシージャを呼び出し、サービスのそのインスタンス(適格なオフィスなど)に固有のパラメーターを渡します。この割り当てストアドプロシージャは、割り当てられた(処理中の)ワークアイテムにスタンプを付け、作業が完了すると、最後のストアドプロシージャが呼び出され、アイテムが「キュー」(テーブル)から削除されます。

このソリューションには、単純なSQLselectステートメントでこれらの「キュー」の状態をすばやく調べることができるという点でいくつかの利点があります。キューを簡単に操作することもできます(たとえば、単純なSQL更新ステートメントで優先順位を上げることができます)。ただし、欠点として、これらのキューテーブルのデッドロックに対処しなければならず、これらのストアドプロシージャを作成する必要があります(しばらくすると面倒になります)。

どういうわけか、MSMQ(WCSの有無にかかわらず)またはServiceBrokerのいずれかがより洗練されたソリューションを提供できるはずだと思います。自分のキューイング/作業項目処理システムをローリングするのは、気分が悪いだけです。しかし、私が知る限り、これらのテクノロジーは、割り当てプロセスに必要な柔軟性を提供していません。私は自分が間違っていることを望んでいます。どんなアドバイスでも大歓迎です。

4

2 に答える 2

2

作業の原子単位の概念はグループのように思えます。したがって、グループ ID を特定したメッセージのみをキューに入れることをお勧めします。その後、ワーカーは、グループ ID を 1 つ以上の作業項目にマップするテーブルに移動する必要があります。

複数のキュー (NY-High、NY-Low、DC-High、DC-Low など) を使用して、その他の問題を処理できます。

ただし、正直なところ、現在のアーキテクチャでデッドロックの問題を修正する方が適切だと思います。Update Lock ヒントと Read Past ヒントを使用して、キュー テーブルから TOP 1 メッセージを読み取る必要があります。これらのメッセージは、優先度ロジックと任意のフィルター条件 (オフィス/場所) によって並べ替えられます。次に、1 つのメッセージを処理し、ステータスを変更するか、別のテーブルに移動します。デッドロックの問題なしに、そのストアド プロシージャを並行して呼び出すことができるはずです。

于 2008-10-21T00:03:17.863 に答える
1

キューは FIFO 順であり、ランダム アクセス順ではありません。FIFO オーダーが必要だと言っていますが、変数のランダムなセットに関して FIFO オーダーが必要です。これは本質的にランダムな順序です。キューを使用する場合は、メッセージがキューに入った後ではなく、キューに入る前に順序を決定できる必要があります。

于 2008-10-15T19:49:40.467 に答える