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
aqueue-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ý natrue
hodnotu . - 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
naJohn
.
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ž 10
chat
.
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.