0

複数のエージェントと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.WorkStatusTypeId2、3、または 4 は、特定のエージェントに割り当てられていることに対応します (フィールドのHostName+ServiceNameペアで示されます)。
  • BackgroundJobService.AgentStatusTypeId2 のうちの 1 つはライブ エージェントに対応します

残念ながら、私のクエリにはバグがあります。BackgroundJobWorkテーブルにエージェントのエントリがまったくない場合はどうなりますか? この場合、そのエージェントは、ライブ エージェントであっても、クエリによって生成された結果から除外されます。それは醜いバグです。

おそらく、SQL を別の方向に向ける必要があります。ワークロード テーブル ( ) を調べBackgroundJobWorkてからライブ ステータス テーブル ( BackgroundJobService) と照合するのではなく、まず後者を見て前者と照合する必要があります。これは、ライブ ステータスがtable は、エージェントごとに 1 つの行を持つことが保証されています。

しかし、私には確信が持てず、今まで満足のいくクエリが生成されませんでした.

4

2 に答える 2