배포 모드

배포 정책을 만들 때 다음 배포 모드 중 하나를 지정하여 작업자에게 작업을 배포할 때 사용할 전략을 정의합니다.

라운드 로빈 모드

사용 가능한 각 작업자가 순서대로 작업을 수신할 수 있도록 작업이 순환 방식으로 배포됩니다.

가장 긴 유휴 모드

작업은 먼저 가장 적게 활용되는 작업자에게 배포됩니다. 동점이 있으면 더 오랜 시간 동안 사용할 수 있는 작업자를 선택합니다. 사용률은 다음 알고리즘에 의해 Load Ratio로 계산됩니다.

부하 비율 = 작업자에 할당된 모든 작업에서 사용하는 용량 집계/작업자의 총 용량

예시

chat 작업이 작업자에 대해 하나의 용량을 사용하도록 구성되었다고 가정합니다. 새 채팅 작업이 작업 라우터로 큐에 대기되고 다음 작업자를 사용하여 작업을 수행할 수 있습니다.

Worker A:
Capacity = 5
ConsumedScore = 3 (Currently handling 3 chats)
LoadRatio = 3 / 5 = 0.6
LastAvailable: 5 mins ago

Worker B:
Capacity = 4
ConsumedScore = 3 (Currently handling 3 chats)
LoadRatio = 3 / 4 = 0.75
LastAvailable: 3 min ago

Worker C:
Capacity = 5
ConsumedScore = 3 (Currently handling 3 chats)
LoadRatio = 3 / 5 = 0.6
LastAvailable: 7 min ago

Worker D:
Capacity = 3
ConsumedScore = 0 (Currently idle)
LoadRatio = 0 / 4 = 0
LastAvailable: 2 min ago

Workers would be matched in order: D, C, A, B

작업자 D의 부하 비율이 가장 낮으므로(0) 작업자 D가 먼저 작업을 제공받습니다. 작업자 A와 C는 동일한 부하 비율(0.6)로 동점입니다. 그러나 작업자 C는 작업자 A(5분 전)보다 더 오래(7분 전) 사용할 수 있으므로 작업자 C가 작업자 A보다 먼저 매칭됩니다. 마지막으로 작업자 B의 부하 비율이 가장 높으므로(0.75) 작업자 B는 마지막으로 매칭됩니다.

최상의 작업자 모드

작업을 가장 잘 처리할 수 있는 작업자가 먼저 선택됩니다. 채점 규칙을 지정하여 두 작업자를 비교하도록 식 또는 Azure 함수로 작업자 순위를 지정하는 논리를 사용자 지정할 수 있습니다. 예제 참조

채점 규칙이 제공되지 않으면 이 배포 모드는 작업의 레이블 및 선택기가 작업자의 레이블과 매칭하는 방식에 따라 작업자를 평가하는 기본 채점 메서드를 대신 사용합니다. 알고리즘은 아래에 설명되어 있습니다.

기본 레이블 매칭

작업의 레이블을 기반으로 점수를 계산하기 위해 작업의 해당 레이블과 매칭되는 모든 작업자 레이블에 대해 Match Score를 1씩 증분한 다음, 작업의 총 레이블 수로 나눕니다. 따라서 매칭되는 레이블이 많을수록 작업자의 Match Score가 높아질 수 있습니다. 마지막 Match Score는 항상 0과 1 사이의 값입니다.

예시

작업 1:

{
  "labels": {
    { "language": "english" },
    { "department": "sales" }
  }
}

작업자 A:

{
  "labels": {
    { "language": "english" },
    { "department": "sales" }
  }
}

작업자 B:

{
  "labels": {
    { "language": "english" }
  }
}

작업자 C:

{
  "labels": {
    { "language": "english" },
    { "department": "support" }
  }
}

계산:

Worker A's match score = 1 (for matching english language label) + 1 (for matching department sales label) / 2 (total number of labels) = 1
Worker B's match score = 1 (for matching english language label) / 2 (total number of labels) = 0.5
Worker C's match score = 1 (for matching english language label) / 2 (total number of labels) = 0.5

작업자 A가 먼저 매칭됩니다. 다음으로, 매칭 점수가 동일하므로 더 오랜 시간 동안 사용할 수 있었던 사람이 누구인지에 따라 작업자 B 또는 작업자 C가 매칭됩니다.

기본 작업자 선택기 매칭

작업에 작업자 선택기도 포함된 경우 해당 작업자 선택기의 LabelOperator를 기반으로 Match Score를 계산합니다.

Equal/notEqual 레이블 연산자

작업자 선택기에 LabelOperatorEqual 또는 NotEqual이 있는 경우 위의 Label Matching과 비슷한 방식으로 해당 작업자 선택기와 매칭되는 각 작업 레이블에 대해 점수를 1씩 증분합니다.

예시

작업 2:

{
  "workerSelectors": [
    { "key": "department", "labelOperator": "equals", "value": "billing" },
    { "key": "segment", "labelOperator": "notEquals", "department": "vip" }
  ]
}

작업자 D:

{
  "labels": {
    { "department": "billing" },
    { "segment": "vip" }
  }
}

작업자 E:

{
  "labels": {
    { "department": "billing" }
  }
}

작업자 F:

{
  "labels": {
    { "department": "sales" },
    { "segment": "new" }
  }
}

계산:

Worker D's match score = 1 (for matching department selector) / 2 (total number of worker selectors) = 0.5
Worker E's match score = 1 (for matching department selector) + 1 (for matching segment not equal to vip) / 2 (total number of worker selectors) = 1
Worker F's match score = 1 (for segment not equal to vip) / 2 (total number of labels) = 0.5

작업자 E가 먼저 매칭됩니다. 다음으로, 매칭 점수가 동일하므로 더 오랜 시간 동안 사용할 수 있었던 사람이 누구인지에 따라 작업자 D 또는 작업자 F가 매칭됩니다.

기타 레이블 연산자

크기(GreaterThan/GreaterThanEqual/LessThan/LessThanEqual)를 비교하는 연산자를 사용하는 작업자 선택기의 경우 로지스틱 함수를 사용하여 계산된 양만큼 작업자의 Match Score를 증분합니다(그림 1 참조). 계산은 작업자의 레이블 값이 작업자 선택기 값을 초과하는 정도 또는 작업자 선택기 값을 초과하지 않는 경우 더 적은 양을 기반으로 합니다. 따라서 작업자 선택기 값이 작업자를 초과할수록, 그 정도가 더 커질수록 근로자의 점수는 더 높아집니다.

Diagram that shows logistic function.

그림 1. 로지스틱 함수

다음 함수는 GreaterThan 또는 GreaterThanEqual 연산자에서 사용됩니다.

MatchScore(x) = 1 / (1 + e^(-x)) where x = (labelValue - selectorValue) / selectorValue

다음 함수는 LessThan 또는 LessThanEqual 연산자에서 사용됩니다.

MatchScore(x) = 1 / (1 + e^(-x)) where x = (selectorValue - labelValue) / selectorValue

예시

작업 3:

{
  "workerSelectors": [
    { "key": "language", "operator": "equals", "value": "french" },
    { "key": "sales", "operator": "greaterThanEqual", "value": 10 },
    { "key": "cost", "operator": "lessThanEqual", "value": 10 }
  ]
}

작업자 G:

{
  "labels": {
    { "language": "french" },
    { "sales": 10 },
    { "cost": 10 }
  }
}

작업자 H:

{
  "labels": {
    { "language": "french" },
    { "sales": 15 },
    { "cost": 10 }
  }
}

작업자 I:

{
  "labels": {
    { "language": "french" },
    { "sales": 10 },
    { "cost": 9 }
  }
}

계산:

Worker G's match score = (1 + 1 / (1 + e^-((10 - 10) / 10)) + 1 / (1 + e^-((10 - 10) / 10))) / 3 = 0.667
Worker H's match score = (1 + 1 / (1 + e^-((15 - 10) / 10)) + 1 / (1 + e^-((10 - 10) / 10))) / 3 = 0.707
Worker I's match score = (1 + 1 / (1 + e^-((10 - 10) / 10)) + 1 / (1 + e^-((10 - 9) / 10))) / 3 = 0.675

세 명의 작업자는 모두 해당 작업에서 작업자 선택기와 매칭되며 작업할 자격을 얻습니다. 한편, 작업자 H가 “sales” 작업자 선택기의 값을 5점 차이로 초과한다는 것을 알 수 있습니다. 반면에 작업자 I는 비용 작업자 선택기의 값만 1점 차이로 초과합니다. 작업자 G는 작업자 선택기의 값을 전혀 초과하지 않습니다. 따라서 작업자 H가 먼저 매칭된 다음, 이어서 작업자 I가, 마지막으로 작업자 G가 매칭됩니다.