Modos de distribuição
Ao criar uma política de distribuição, especificamos um dos seguintes modos de distribuição para definir a estratégia a ser usada na distribuição de trabalhos aos trabalhadores:
Modo round robin
Os postos de trabalho serão distribuídos de forma circular, de modo a que cada trabalhador disponível receba os postos de trabalho em sequência.
Modo inativo mais longo
Os postos de trabalho serão distribuídos ao trabalhador menos utilizado primeiro. Se houver empate, escolheremos o trabalhador que está disponível há mais tempo. A utilização é calculada como um Load Ratio
pelo seguinte algoritmo:
Load Ratio = Agregado da capacidade consumida por todos os trabalhos atribuídos ao trabalhador / Capacidade total do trabalhador
Exemplo
Suponha que cada chat
trabalho foi configurado para consumir uma capacidade para um trabalhador. Um novo trabalho de chat é enfileirado no Job Router e os seguintes trabalhadores estão disponíveis para assumir o trabalho:
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
O trabalhador D tem a taxa de ocupação mais baixa (0), pelo que o trabalhador D receberá a oferta de emprego primeiro. Os trabalhadores A e C estão empatados com a mesma relação de carga (0,6). No entanto, o Trabalhador C esteve disponível por mais tempo (7 minutos atrás) do que o Trabalhador A (5 minutos atrás), portanto, o Trabalhador C será correspondido antes do Trabalhador A. Finalmente, o Trabalhador B será correspondido em último lugar, uma vez que o Trabalhador B tem a maior taxa de carga (0,75).
Melhor modo de trabalho
Os trabalhadores mais aptos a lidar com o trabalho são escolhidos primeiro. A lógica para classificar Trabalhadores pode ser personalizada, com uma expressão ou função do Azure para comparar dois trabalhadores especificando uma Regra de Pontuação. Ver exemplo
Quando uma Regra de Pontuação não é fornecida, esse modo de distribuição usará o método de pontuação padrão, que avalia os trabalhadores com base em como os rótulos e seletores do trabalho correspondem aos rótulos do trabalhador. Os algoritmos são descritos abaixo.
Correspondência de rótulo padrão
Para calcular uma pontuação com base nos rótulos do trabalho, incrementamos o Match Score
por 1 para cada rótulo de trabalhador que corresponde a um rótulo correspondente no trabalho e, em seguida, dividimos pelo número total de rótulos no trabalho. Portanto, quanto mais rótulos corresponderem, maior será a do Match Score
trabalhador. O final Match Score
será sempre um valor entre 0 e 1.
Exemplo
Emprego 1:
{
"labels": {
{ "language": "english" },
{ "department": "sales" }
}
}
Trabalhador A:
{
"labels": {
{ "language": "english" },
{ "department": "sales" }
}
}
Trabalhador B:
{
"labels": {
{ "language": "english" }
}
}
Trabalhador C:
{
"labels": {
{ "language": "english" },
{ "department": "support" }
}
}
Cálculo:
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
O trabalhador A seria correspondido primeiro. Em seguida, o Trabalhador B ou o Trabalhador C seriam correspondidos, dependendo de quem estivesse disponível por mais tempo, uma vez que o placar da partida está empatado.
Correspondência padrão do seletor de trabalhadores
No caso em que o trabalho também contém seletores de trabalhadores, calcularemos com Match Score
base no LabelOperator
seletor desse trabalhador.
Operadores de rótulo Igual/nãoIgual
Se o seletor de trabalhador tiver o LabelOperator
Equal
ou NotEqual
, incrementaremos a pontuação em 1 para cada rótulo de trabalho que corresponda a esse seletor de trabalhador, de maneira semelhante à Label Matching
acima.
Exemplo
Emprego 2:
{
"workerSelectors": [
{ "key": "department", "labelOperator": "equals", "value": "billing" },
{ "key": "segment", "labelOperator": "notEquals", "department": "vip" }
]
}
Trabalhador D:
{
"labels": {
{ "department": "billing" },
{ "segment": "vip" }
}
}
Trabalhador E:
{
"labels": {
{ "department": "billing" }
}
}
Trabalhador F:
{
"labels": {
{ "department": "sales" },
{ "segment": "new" }
}
}
Cálculo:
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
O trabalhador E seria correspondido primeiro. Em seguida, o Trabalhador D ou o Trabalhador F seriam correspondidos, dependendo de quem estivesse disponível por mais tempo, já que o placar da partida está empatado.
Outros operadores de rótulos
Para seletores de trabalhadores usando operadores que comparam por magnitude (), incrementaremos o trabalhador em uma quantidade calculada usando a função logística (GreaterThan
LessThan
///GreaterThanEqual
LessThanEqual
Ver Fig. 1).Match Score
O cálculo é baseado em quanto o valor do rótulo do trabalhador excede o valor do seletor de trabalhador ou um valor menor se não exceder o valor do seletor de trabalhador. Portanto, quanto mais valores do seletor de trabalhadores o trabalhador exceder, e quanto maior o grau em que o fizer, maior será a pontuação de um trabalhador.
Fig. 1. Função logística
A função a seguir é usada para operadores GreaterThan ou GreaterThanEqual:
MatchScore(x) = 1 / (1 + e^(-x)) where x = (labelValue - selectorValue) / selectorValue
A seguinte função é usada para operadores LessThan ou LessThanEqual:
MatchScore(x) = 1 / (1 + e^(-x)) where x = (selectorValue - labelValue) / selectorValue
Exemplo
Emprego 3:
{
"workerSelectors": [
{ "key": "language", "operator": "equals", "value": "french" },
{ "key": "sales", "operator": "greaterThanEqual", "value": 10 },
{ "key": "cost", "operator": "lessThanEqual", "value": 10 }
]
}
Trabalhador G:
{
"labels": {
{ "language": "french" },
{ "sales": 10 },
{ "cost": 10 }
}
}
Trabalhador H:
{
"labels": {
{ "language": "french" },
{ "sales": 15 },
{ "cost": 10 }
}
}
Trabalhador I:
{
"labels": {
{ "language": "french" },
{ "sales": 10 },
{ "cost": 9 }
}
}
Cálculo:
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
Todos os três trabalhadores correspondem aos seletores de trabalhadores no trabalho e são elegíveis para trabalhar nele. No entanto, podemos ver que o Trabalhador H excede o valor do seletor de trabalhadores "vendas" por uma margem de 5. Enquanto isso, o Trabalhador I só excede o valor do seletor de trabalhador de custo por uma margem de 1. O trabalhador G não excede nenhum dos valores do seletor de trabalhador. Portanto, o Trabalhador H seria correspondido primeiro, seguido pelo Trabalhador I e, finalmente, o Trabalhador G seria correspondido em último.