Tryby dystrybucji
Podczas tworzenia zasad dystrybucji określamy jeden z następujących trybów dystrybucji, aby zdefiniować strategię używaną podczas dystrybucji zadań do procesów roboczych:
Tryb działania okrężnego
Zadania będą dystrybuowane w sposób okrągły, tak aby każdy dostępny proces roboczy otrzymywał zadania w sekwencji.
Najdłuższy tryb bezczynności
Zadania będą dystrybuowane do procesu roboczego, który jest najmniej wykorzystywany jako pierwszy. Jeśli istnieje krawat, wybierzemy proces roboczy, który był dostępny przez dłuższy czas. Użycie jest obliczane jako Load Ratio
algorytm następujący:
Współczynnik obciążenia = agregacja pojemności zużywanej przez wszystkie zadania przypisane do procesu roboczego / Łączna pojemność procesu roboczego
Przykład
Załóżmy, że każde chat
zadanie zostało skonfigurowane do korzystania z jednej pojemności dla procesu roboczego. Nowe zadanie czatu jest umieszczane w kolejce do routera zadań, a następujący pracownicy są dostępni do podjęcia zadania:
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
Proces roboczy D ma najniższy współczynnik obciążenia (0), więc najpierw zostanie zaproponowane zadanie robocze D. Procesy robocze A i C są powiązane z tym samym współczynnikiem obciążenia (0,6). Jednak proces roboczy C był dostępny przez dłuższy czas (7 minut temu) niż proces roboczy A (5 minut temu), więc proces roboczy C zostanie dopasowany przed procesem roboczym A. Na koniec proces roboczy B zostanie dopasowany ostatnio, ponieważ proces roboczy B ma najwyższy współczynnik obciążenia (0,75).
Najlepszy tryb roboczy
Pracownicy, którzy są najlepiej w stanie obsłużyć pracę, są wybierane jako pierwsze. Logika klasyfikacji procesów roboczych można dostosować z wyrażeniem lub funkcją platformy Azure w celu porównania dwóch procesów roboczych, określając regułę oceniania. Zobacz przykład
Jeśli reguła oceniania nie zostanie podana, ten tryb dystrybucji będzie używać domyślnej metody oceniania, która ocenia procesy robocze na podstawie tego, jak etykiety i selektory zadania są zgodne z etykietami procesu roboczego. Algorytmy zostały opisane poniżej.
Domyślne dopasowywanie etykiet
Aby obliczyć wynik na podstawie etykiet zadania, zwiększamy Match Score
wartość o 1 dla każdej etykiety procesu roboczego, która pasuje do odpowiedniej etykiety w zadaniu, a następnie dzielimy przez łączną liczbę etykiet w zadaniu. W związku z tym im więcej etykiet pasuje, tym wyższa wartość procesu roboczego Match Score
to . Finał Match Score
zawsze będzie wartością z zakresu od 0 do 1.
Przykład
Zadanie 1:
{
"labels": {
{ "language": "english" },
{ "department": "sales" }
}
}
Proces roboczy A:
{
"labels": {
{ "language": "english" },
{ "department": "sales" }
}
}
Proces roboczy B:
{
"labels": {
{ "language": "english" }
}
}
Proces roboczy C:
{
"labels": {
{ "language": "english" },
{ "department": "support" }
}
}
Obliczenie:
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
Proces roboczy A zostanie dopasowany jako pierwszy. Następnie proces roboczy B lub proces roboczy C będzie zgodny, w zależności od tego, kto był dostępny przez dłuższy czas, ponieważ wynik dopasowania jest powiązany.
Domyślne dopasowanie selektora procesów roboczych
W przypadku, gdy zadanie zawiera również selektory procesów roboczych, obliczymy wartość Match Score
na LabelOperator
podstawie selektora tego procesu roboczego.
Operatory etykiet równości/notEqual
Jeśli selektor procesów roboczych ma LabelOperator
Equal
wartość lub NotEqual
, zwiększamy wynik o 1 dla każdej etykiety zadania zgodnej z selektorem procesu roboczego Label Matching
w podobny sposób, jak powyżej.
Przykład
Zadanie 2:
{
"workerSelectors": [
{ "key": "department", "labelOperator": "equals", "value": "billing" },
{ "key": "segment", "labelOperator": "notEquals", "department": "vip" }
]
}
Proces roboczy D:
{
"labels": {
{ "department": "billing" },
{ "segment": "vip" }
}
}
Proces roboczy E:
{
"labels": {
{ "department": "billing" }
}
}
Proces roboczy F:
{
"labels": {
{ "department": "sales" },
{ "segment": "new" }
}
}
Obliczenie:
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
Najpierw zostanie dopasowany proces roboczy E. Następnie element Roboczy D lub Proces roboczy F będzie zgodny, w zależności od tego, kto był dostępny przez dłuższy czas, ponieważ wynik dopasowania jest powiązany.
Inne operatory etykiet
W przypadku selektorów procesów roboczych używających operatorów, które porównują wielkość (GreaterThan
LessThan
///GreaterThanEqual
LessThanEqual
), zwiększamy wartość procesu roboczego Match Score
o kwotę obliczoną przy użyciu funkcji logistycznej (zobacz Rysunek 1). Obliczenie jest oparte na tym, ile wartość etykiety procesu roboczego przekracza wartość selektora procesu roboczego lub mniejszą, jeśli nie przekracza wartości selektora procesu roboczego. W związku z tym im więcej wartości selektora procesów roboczych przekracza, a im większy stopień, w jakim to robi, tym wyższy będzie wynik procesu roboczego.
Rys. 1. Funkcja logistyczna
Następująca funkcja jest używana dla operatorów GreaterThan lub GreaterThanEqual:
MatchScore(x) = 1 / (1 + e^(-x)) where x = (labelValue - selectorValue) / selectorValue
Następująca funkcja jest używana dla operatorów LessThan lub LessThanEqual:
MatchScore(x) = 1 / (1 + e^(-x)) where x = (selectorValue - labelValue) / selectorValue
Przykład
Zadanie 3:
{
"workerSelectors": [
{ "key": "language", "operator": "equals", "value": "french" },
{ "key": "sales", "operator": "greaterThanEqual", "value": 10 },
{ "key": "cost", "operator": "lessThanEqual", "value": 10 }
]
}
Proces roboczy G:
{
"labels": {
{ "language": "french" },
{ "sales": 10 },
{ "cost": 10 }
}
}
Proces roboczy H:
{
"labels": {
{ "language": "french" },
{ "sales": 15 },
{ "cost": 10 }
}
}
Proces roboczy I:
{
"labels": {
{ "language": "french" },
{ "sales": 10 },
{ "cost": 9 }
}
}
Obliczenie:
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
Wszyscy trzej pracownicy są zgodni z selektorami procesów roboczych w zadaniu i kwalifikują się do pracy nad nim. Widać jednak, że wartość selektora procesu roboczego H przekracza wartość selektora "sprzedaży" o margines 5. Tymczasem pracownik przekracza tylko wartość selektora kosztu o margines 1. Proces roboczy G nie przekracza żadnych wartości selektora procesów roboczych. W związku z tym proces roboczy H zostanie dopasowany jako pierwszy, a następnie proces roboczy I i wreszcie Pracownik G zostanie dopasowany ostatnio.