Udostępnij za pośrednictwem


Tryby dystrybucji

Podczas tworzenia zasad dystrybucji określamy jeden z następujących trybów dystrybucji, aby zdefiniować strategię używaną podczas przydzielania zadań pracownikom.

Tryb działania okrężnego

Zadania będą rozdzielane w sposób cykliczny, tak aby każdy dostępny pracownik otrzymywał je w kolejności.

Najdłuższy tryb bezczynności

Zadania będą rozdzielane najpierw do pracownika, który jest najmniej obciążony. Jeśli jest remis, wybierzemy pracownika, który był dostępny przez dłuższy czas. Wykorzystanie jest obliczane jako Load Ratio przez następujący algorytm.

Współczynnik obciążenia = Suma zdolności zużywanej przez wszystkie zadania przypisane pracownikowi / Łączna zdolność pracownika

Przykład

Załóżmy, że każde chat zadanie zostało skonfigurowane do korzystania z jednej jednostki dla pracownika. 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

Pracownik D ma najniższy współczynnik obciążenia (0), więc zadanie zostanie mu zaproponowane jako pierwszemu. Pracownicy A i C mają ten sam współczynnik 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 wykonać pracę, są wybierani jako pierwsi. Logikę do ustalania priorytetów pracowników można dostosować przy użyciu wyrażenia lub funkcji Azure, aby porównać dwóch pracowników, określając regułę punktacji. 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 pracowników na podstawie tego, jak etykiety i selektory zadania są zgodne z etykietami pracownika. Algorytmy zostały opisane poniżej.

Domyślne dopasowywanie etykiet

Aby obliczyć wynik na podstawie etykiet zadania, zwiększamy Match Score o 1 dla każdej etykiety pracownika, która pasuje do odpowiedniej etykiety w zadaniu, a następnie dzielimy przez całkowitą liczbę etykiet w zadaniu. W związku z tym, im więcej etykiet pasowało, tym wyższa była wartość Match Score. Finał Match Score zawsze będzie wartością z zakresu od 0 do 1.

Przykład

Zadanie 1:

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

Pracownik A

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

Pracownik B

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

Pracownik 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

Pracownik A zostanie dopasowany jako pierwszy. Następnie pracownik B lub pracownik C zostanie dopasowany, w zależności od tego, kto był dostępny przez dłuższy czas, ponieważ wynik dopasowania jest remisowy.

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/nierówności

Jeśli selekcja pracowników ma LabelOperatorEqual lub NotEqual, zwiększamy wynik o 1 dla każdej etykiety zadania zgodnej z tą selekcją pracowników, podobnie jak w przypadku Label Matching powyżej.

Przykład

Zadanie 2:

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

Pracownik D

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

Pracownik E:

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

Pracownik 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 pracownik E. Następnie, Pracownik D lub Pracownik F zostanie dopasowany, w zależności od tego, kto był dostępny przez dłuższy czas, ponieważ wynik oceny jest taki sam.

Inne operatory etykiet

W przypadku selektorów pracowników używających operatorów, które porównują wielkość liczby (GreaterThan/GreaterThanEqual/LessThan/LessThanEqual), zwiększymy wartość pracownika Match Score o wartość 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 przekracza pracownik, i im wyższy stopień, w jakim to robi, tym wyższy będzie wynik pracownika.

Diagram przedstawiający funkcję logistyczną.

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 }
  ]
}

Pracownik G:

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

Pracownik H

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

Pracownik 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 pasują do selektorów pracowników na 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 I przekracza wartość selektora kosztu tylko o 1. Pracownik G nie przekracza żadnej wartości selektora pracowników. W związku z tym Pracownik H zostanie dopasowany jako pierwszy, następnie Pracownik I, a wreszcie Pracownik G zostanie dopasowany ostatnio.