複数のエージェントとBackgroundJobWork
、各エージェントの作業負荷を記録する 1 つのデータベース テーブル ( ) があります。このテーブルには、すべての作業項目ごとにエントリが含まれます。
新しい作業項目を割り当てたいときは、まずこのテーブルをチェックして、割り当て済みの作業項目が最も少ないエージェントを選びます。
エージェントが作業項目を完了すると、ステータスが割り当て済み以外に変更されます。
ねじれがあります。エージェントは別のテーブルでハートビートを報告します ( BackgroundJobService
)。エージェントがタイムリーに報告できなかった場合、そのテーブルのステータスは「無応答」に設定されます。最も負荷の低いエージェントを特定するために使用される SQL クエリは、「ライブ」エージェントのみを調べる必要があります。
最も負荷の低いライブエージェントを選択するための SQL クエリを次に示します。
SELECT bjw.AllocatedAgentHostName HostName, bjw.AllocatedAgentServiceName ServiceName,
SUM(CASE WHEN bjw.WorkStatusTypeId IN (2,3,4) THEN 1 ELSE 0 END) AS InProgress
FROM BackgroundJobWork bjw, BackgroundJobService bjs
WHERE bjw.AllocatedAgentHostName = bjs.HostName
AND bjw.AllocatedAgentServiceName = bjs.ServiceName
AND bjs.AgentStatusTypeId = 2
GROUP BY bjw.AllocatedAgentHostName, bjw.AllocatedAgentServiceName
ORDER BY InProgress
どこ:
BackgroundJobWork.WorkStatusTypeId
2、3、または 4 は、特定のエージェントに割り当てられていることに対応します (フィールドのHostName
+ServiceName
ペアで示されます)。BackgroundJobService.AgentStatusTypeId
2 のうちの 1 つはライブ エージェントに対応します
残念ながら、私のクエリにはバグがあります。BackgroundJobWork
テーブルにエージェントのエントリがまったくない場合はどうなりますか? この場合、そのエージェントは、ライブ エージェントであっても、クエリによって生成された結果から除外されます。それは醜いバグです。
おそらく、SQL を別の方向に向ける必要があります。ワークロード テーブル ( ) を調べBackgroundJobWork
てからライブ ステータス テーブル ( BackgroundJobService
) と照合するのではなく、まず後者を見て前者と照合する必要があります。これは、ライブ ステータスがtable は、エージェントごとに 1 つの行を持つことが保証されています。
しかし、私には確信が持てず、今まで満足のいくクエリが生成されませんでした.