Sdílet prostřednictvím


Jak jsou pracovní místa přiřazována pracovníkům

Tento dokument popisuje registraci pracovních procesů, odesílání úloh a jejich vzájemné shody.

Registrace pracovního procesu

Než může pracovní proces přijímat nabídky pro službu úlohy, musí být nejprve zaregistrován nastavením availableForOffers na hodnotu true. Dále musíme určit, které fronty pracovní proces naslouchá a jaké kanály může zpracovat. Po registraci obdržíte z Event Gridu událost RouterWorkerRegistered a stav pracovního procesu se změní na active.

V následujícím příkladu zaregistrujeme pracovníka pro:

  • Poslechnout queue-1 a queue-2
  • Pracujte jak s hlasovými, tak chatovacími kanály. V takovém případě může pracovní proces současně provést jednu voice úlohu nebo dvě chat úlohy. Toto nastavení se konfiguruje zadáním celkové kapacity pracovního procesu a přiřazením nákladů na úlohu pro každý kanál.
  • Máte sadu popisků popisků popisků pracovního procesu, které by mohly pomoct určit, jestli se jedná o shodu pro konkrétní úlohu.
var worker = await client.CreateWorkerAsync(new CreateWorkerOptions(workerId: "worker-1", capacity: 2)
{
    AvailableForOffers = true,
    Queues = { "queue1", "queue2" },
    Channels =
    {
        new RouterChannel(channelId: "voice", capacityCostPerJob: 2),
        new RouterChannel(channelId: "chat", capacityCostPerJob: 1)
    },
    Labels =
    {
        ["Skill"] = new RouterValue(11),
        ["English"] = new RouterValue(true),
        ["French"] = new RouterValue(false),
        ["Vendor"] = new RouterValue("Acme")
    }
});
let worker = await client.path("/routing/workers/{workerId}", "worker-1").patch({
    body: {
        availableForOffers: true,
        capacity: 2,
        queues: ["queue1", "queue2"],
        channels: [
            { channelId: "voice", capacityCostPerJob: 2 },
            { channelId: "chat", capacityCostPerJob: 1 }
        ],
        labels: {
            Skill: 11,
            English: true,
            French: false,
            Vendor: "Acme"
        }
    },
    contentType: "application/merge-patch+json"
});
worker = client.upsert_worker(
    worker_id = "worker-1",
    available_for_offers = True,
    capacity = 2,
    queues = ["queue1", "queue2"],
    channels = [
        RouterChannel(channel_id = "voice", capacity_cost_per_job = 2),
        RouterChannel(channel_id = "chat", capacity_cost_per_job = 1)
    ],
    labels = {
        "Skill": 11,
        "English": True,
        "French": False,
        "Vendor": "Acme"
    }
)
RouterWorker worker = client.createWorker(new CreateWorkerOptions("worker-1", 2)
    .setAvailableForOffers(true)
    .setQueues(List.of("queue1", "queue2"))
    .setChannels(List.of(
        new RouterChannel("voice", 2),
        new RouterChannel("chat", 1)))
    .setLabels(Map.of(
        "Skill", new RouterValue(11),
        "English", new RouterValue(true),
        "French", new RouterValue(false),
        "Vendor", new RouterValue("Acme"))));

Odeslání úlohy

V následujícím příkladu odešleme úlohu, která

  • Chodí přímo do školy queue1.
  • chat Pro kanál.
  • Selektorem pracovního procesu, který určuje, že každý pracovník obsluha této úlohy musí mít popisek English nastavený na truehodnotu .
  • Selektorem pracovního procesu, který určuje, že každý pracovník obsluha této úlohy musí mít popisek Skill větší než 10 a tato podmínka vyprší po jedné minutě.
  • S popiskem nastaveného name na John.
await client.CreateJobAsync(new CreateJobOptions("job1", "chat", "queue1")
{
    RequestedWorkerSelectors =
    {
        new RouterWorkerSelector(key: "English", labelOperator: LabelOperator.Equal, value: new RouterValue(true)),
        new RouterWorkerSelector(key: "Skill", labelOperator: LabelOperator.GreaterThan, value: new RouterValue(10))
            { ExpiresAfter = TimeSpan.FromMinutes(5) }
    },
    Labels = { ["name"] = new RouterValue("John") }
});
await client.path("/routing/jobs/{jobId}", "job1").patch({
    body: {
        channelId: "chat",
        queueId: "queue1",
        requestedWorkerSelectors: [
            { key: "English", labelOperator: "equal", value: true },
            { key: "Skill", labelOperator: "greaterThan", value: 10, expiresAfterSeconds: 300 },
        ],
        labels: { name: "John" }
    },
    contentType: "application/merge-patch+json"
})
client.upsert_job(
    job_id = "job1",
    channel_id = "chat",
    queue_id = "queue1",
    requested_worker_selectors = [
        RouterWorkerSelector(
          key = "English",
          label_operator = LabelOperator.EQUAL,
          value = True
        ),
        RouterWorkerSelector(
          key = "Skill",
          label_operator = LabelOperator.GREATER_THAN,
          value = True,
          expires_after_seconds = 300
        )
    ],
    labels = { "name": "John" }
)
client.createJob(new CreateJobOptions("job1", "chat", "queue1")
    .setRequestedWorkerSelectors(List.of(
        new RouterWorkerSelector("English", LabelOperator.EQUAL, new RouterValue(true)),
        new RouterWorkerSelector("Skill", LabelOperator.GREATER_THAN, new RouterValue(10))
            .setExpiresAfter(Duration.ofMinutes(5))))
    .setLabels(Map.of("name", new RouterValue("John"))));

Směrovač úloh se pokusí tuto úlohu spárovat s dostupným pracovníkem, který naslouchá queue1 kanálu s nastaveným true English a Skill vyšším než 10chat . Jakmile se vytvoří shoda, vytvoří se nabídka. Zásady distribuce, které jsou připojené k frontě, řídí, kolik aktivních nabídek může být pro úlohu a jak dlouho je každá nabídka platná. Obdržíte událost OfferIssued, která by vypadala takto:

{
    "workerId": "worker-1",
    "jobId": "7f1df17b-570b-4ae5-9cf5-fe6ff64cc712",
    "channelId": "chat",
    "queueId": "queue1",
    "offerId": "525fec06-ab81-4e60-b780-f364ed96ade1",
    "offerTimeUtc": "2021-06-23T02:43:30.3847144Z",
    "expiryTimeUtc": "2021-06-23T02:44:30.3847674Z",
    "jobPriority": 1,
    "jobLabels": {
        "name": "John"
    }
}

Událost OfferIssued obsahuje podrobnosti o úloze, pracovním procesu, o tom, jak dlouho je nabídka platná, a o offerId tom, jak dlouho je potřeba úlohu přijmout nebo odmítnout.

Poznámka:

Maximální doba života úlohy je 90 dní, po jejímž uplynutí platnost automaticky vyprší.

Zrušení registrace pracovního procesu

Pokud chce pracovní proces přestat přijímat nabídky, může se zrušit jeho registrace nastavením AvailableForOffers při false aktualizaci pracovního procesu a obdržíte událost RouterWorkerDeregistered z Event Gridu. Všechny existující nabídky pracovního procesu jsou odvolány a obdržíte událost RouterWorkerOfferRefferRevolat pro každou nabídku.

worker.AvailableForOffers = false;
worker = await client.UpdateWorkerAsync(worker);
worker = await client.path("/routing/workers/{workerId}", worker.body.id).patch({
    body: { availableForOffers: false },
    contentType: "application/merge-patch+json"
});
worker = client.upsert_worker(worker_id = worker.id, available_for_offers = False)
client.updateWorker(worker.getId(), BinaryData.fromObject(worker.setAvailableForOffers(false)), null);

Poznámka:

Pokud je pracovní proces zaregistrovaný a nečinný po dobu delší než 7 dnů, automaticky se zruší jeho registrace. Po zrušení registrace je draining stav pracovního procesu, pokud je stále přiřazena jedna nebo více úloh nebo inactive pokud nejsou přiřazeny žádné úlohy.