Zuordnung von Aufträgen zu Workern
In diesem Dokument werden die Registrierung von Workern, die Einreichung von Aufträgen und deren Abgleich beschrieben.
Workerregistrierung
Bevor ein Arbeitnehmer Angebote für einen Job erhalten kann, muss er zuerst registriert werden, indem er auf "true" festgelegt availableForOffers
ist. Als Nächstes müssen wir angeben, welche Warteschlangen der Worker überwacht und welche Kanäle verarbeitet werden können. Nach der Registrierung erhalten Sie ein RouterWorkerRegistered-Ereignis aus dem Ereignisraster, und der Status des Mitarbeiters wird in " geändert active
.
Im folgenden Beispiel registrieren wir einen Worker für:
- Lauschen auf
queue-1
undqueue-2
- Fähigkeit zur Verarbeitung sowohl der Sprach- als auch der Chatkanäle. In diesem Fall kann der Worker entweder jeweils einen einzelnen
voice
-Auftrag oder zweichat
-Aufträge zugleich übernehmen. Diese Einstellung wird konfiguriert, indem die Gesamtkapazität des Mitarbeiters angegeben und für jeden Kanal kosten pro Auftrag zugewiesen wird. - Verfügbarkeit einer Reihe von Bezeichnungen, die Aspekte des Worker beschreiben, mit denen bestimmt werden kann, ob er sich für einen bestimmten Auftrag eignet.
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"))));
Auftragseinreichung
Im folgenden Beispiel übermitteln wir einen Auftrag, der
- Er gelangt direkt in
queue1
. - Er ist für den
chat
-Kanal bestimmt. - Mit einer Arbeitsauswahl, die angibt, dass alle Mitarbeiter, die diesen Auftrag warten, über eine Bezeichnung verfügen müssen, auf die
English
true
festgelegt ist. - Mit einer Arbeitsauswahl, die angibt, dass jeder Mitarbeiter, der diesen Auftrag bedient, über eine Bezeichnung von
Skill
größer als10
verfügen muss, und diese Bedingung läuft nach einer Minute ab. - Die Bezeichnung
name
ist aufJohn
festgelegt.
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"))));
Auftragsrouter versucht, diesen Auftrag mit einem verfügbaren Worker abzugleichen, der auf den Kanal lauschtqueue1
, wobei English
er auf true
und Skill
größer als festgelegt 10
ist.chat
Sobald eine Zuordnung erfolgt ist, wird ein Angebot erstellt. Die Verteilungsrichtlinie, die an die Warteschlange angefügt ist, steuert, wie viele aktive Angebote für einen Auftrag vorhanden sein können und wie lange jedes Angebot gültig ist. Sie erhalten ein OfferIssued-Ereignis , das wie folgt aussieht:
{
"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"
}
}
Das OfferIssued-Ereignis enthält Details über den Job, den Arbeitnehmer, wie lange das Angebot gültig ist, und die offerId
, die Sie annehmen oder ablehnen müssen.
Hinweis
Die maximale Lebensdauer eines Auftrags beträgt 90 Tage. Danach läuft er automatisch ab.
Deregistration von Arbeitnehmern
Wenn ein Mitarbeiter das Empfangen von Angeboten beenden möchte, kann die Registrierung aufgehoben werden, indem er beim Aktualisieren des Workers auf " AvailableForOffers
false
RouterWorkerDeregistered" festgelegt ist und sie ein RouterWorkerDeregistered-Ereignis aus dem Event Grid erhalten. Alle vorhandenen Angebote für den Mitarbeiter werden widerrufen und Sie erhalten für jedes Angebot ein RouterWorkerOfferRevoked-Ereignis .
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);
Hinweis
Wenn ein Mitarbeiter länger als 7 Tage im Leerlauf registriert ist, wird er automatisch registriert. Nach der Registrierung ist draining
der Status des Arbeitnehmers, wenn noch mindestens ein Auftrag zugewiesen ist oder inactive
keine Aufträge zugewiesen sind.