Modalità di corrispondenza dei processi con i lavoratori
Questo documento descrive la registrazione dei lavoratori, l'invio di posti di lavoro e il modo in cui corrispondono tra loro.
Registrazione del ruolo di lavoro
Prima che un lavoratore possa ricevere offerte per il servizio di un processo, deve essere registrato prima impostando su availableForOffers
true. Successivamente, è necessario specificare le code su cui il ruolo di lavoro è in ascolto e sui canali che può gestire. Dopo la registrazione, si riceve un evento RouterWorkerRegistered da Griglia di eventi e lo stato del ruolo di lavoro viene modificato in active
.
Nell'esempio seguente viene registrato un ruolo di lavoro per:
- Ascolta e
queue-1
queue-2
- Essere in grado di gestire sia i canali vocali che i canali di chat. In questo caso, il ruolo di lavoro potrebbe assumere un singolo
voice
processo contemporaneamente o duechat
processi. Questa impostazione viene configurata specificando la capacità totale del ruolo di lavoro e assegnando un costo per processo per ogni canale. - Disporre di un set di etichette che descrivono gli elementi relativi al ruolo di lavoro che potrebbero aiutare a determinare se si tratta di una corrispondenza per un determinato processo.
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"))));
Invio di processi
Nell'esempio seguente viene inviato un processo che
- Passa direttamente a
queue1
. - Per il
chat
canale. - Con un selettore di lavoro che specifica che qualsiasi ruolo di lavoro che esegue la manutenzione di questo processo deve avere un'etichetta
English
impostata sutrue
. - Con un selettore di lavoro che specifica che qualsiasi ruolo di lavoro che esegue la manutenzione di questo processo deve avere un'etichetta maggiore di
Skill
10
e questa condizione scadrà dopo un minuto. - Con un'etichetta impostata
name
suJohn
.
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"))));
Il router processo tenta di associare questo processo a un ruolo di lavoro disponibile in queue1
ascolto per il chat
canale, con English
impostato su true
e Skill
maggiore di 10
.
Una volta effettuata una corrispondenza, viene creata un'offerta. I criteri di distribuzione associati alla coda controllano il numero di offerte attive che possono esistere per un processo e per quanto tempo ogni offerta è valida. Si riceve un evento OfferIssued simile al seguente:
{
"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"
}
}
L'evento OfferIssued include dettagli sul processo, sul ruolo di lavoro, sul periodo di validità dell'offerta e sull'elemento offerId
che è necessario accettare o rifiutare il processo.
Nota
La durata massima di un processo è di 90 giorni, dopo la quale scadrà automaticamente.
Annullamento della registrazione del ruolo di lavoro
Se un ruolo di lavoro vuole interrompere la ricezione di offerte, può essere annullata la registrazione impostando AvailableForOffers
su false
quando si aggiorna il ruolo di lavoro e si riceve un evento RouterWorkerDeregistered da Griglia di eventi. Tutte le offerte esistenti per il ruolo di lavoro vengono revocate e si riceve un evento RouterWorkerOfferRevoked per ogni offerta.
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);
Nota
Se un ruolo di lavoro è registrato e inattiva per più di 7 giorni, verrà annullata automaticamente la registrazione. Una volta annullata la registrazione, lo stato del ruolo di lavoro è draining
se uno o più processi sono ancora assegnati o inactive
se non vengono assegnati processi.