İşleri çalışanlarla eşleştirme
Bu belgede çalışanların kaydı, iş gönderimi ve birbirleriyle nasıl eşleştirildikleri açıklanmaktadır.
Çalışan Kaydı
Bir çalışanın bir işe hizmet verme tekliflerini alabilmesi için önce true olarak ayarlanarak availableForOffers
kaydedilmesi gerekir. Ardından, çalışanın hangi kuyrukları dinleyebileceğini ve hangi kanalları işleyebileceğini belirtmemiz gerekir. Kaydedildikten sonra, Event Grid'den RouterWorkerRegistered olayı alırsınız ve çalışanın durumu olarak active
değiştirilir.
Aşağıdaki örnekte, bir çalışanı şu şekilde kaydederiz:
- ve'i
queue-1
dinlemequeue-2
- Hem ses hem de sohbet kanallarını işleyebilme. Bu durumda, çalışan bir kerede tek
voice
bir işi veya aynı anda ikichat
işi alabilir. Bu ayar, çalışanın toplam kapasitesi belirtilerek ve her kanal için iş başına bir maliyet atanarak yapılandırılır. - Çalışanın belirli bir iş için eşleşip eşleşmediğini belirlemeye yardımcı olabilecek öğeleri açıklayan bir etiket kümesine sahip olun.
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"))));
İş Gönderimi
Aşağıdaki örnekte,
- Doğrudan adresine
queue1
gider. - Kanal için
chat
. - Bu işe hizmet veren herhangi bir çalışanın olarak ayarlanmış
true
bir etiketiEnglish
olması gerektiğini belirten bir çalışan seçicisi ile. - Bu işe hizmet veren herhangi bir çalışanın değerinden büyük
10
bir etikete sahip olması gerektiğini ve bu koşulunSkill
süresinin bir dakika sonra dolacağını belirten bir çalışan seçicisi ile. - etiketi
name
olarak ayarlanmıştırJohn
.
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"))));
İş Yönlendiricisi, bu işi kanal için chat
dinleyen queue1
kullanılabilir bir çalışanla English
eşleştirmeye true
çalışır; ayarı ve Skill
daha büyük 10
olur.
Bir eşleşme yapıldıktan sonra bir teklif oluşturulur. Kuyruğa eklenen dağıtım ilkesi, bir iş için kaç etkin teklif olabileceğini ve her teklifin ne kadar süre geçerli olduğunu denetler. Şuna benzer bir OfferIssued Olayı alırsınız:
{
"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"
}
}
OfferIssued Olayı, iş, çalışan, teklifin ne kadar süre geçerli olduğu ve offerId
işi kabul etmeniz veya reddetmeniz gerektiği hakkındaki ayrıntıları içerir.
Dekont
bir işin en uzun ömrü 90 gündür ve bu sürenin sonunda otomatik olarak süresi dolar.
Çalışan Kaydı Kaldırma
Bir çalışan teklifleri almayı durdurmak isterse, çalışanı güncelleştirirken olarak ayarlanarak AvailableForOffers
false
kaydı kaldırılabilir ve Event Grid'den RouterWorkerDeregistered olayı alırsınız. Çalışan için mevcut tüm teklifler iptal edilir ve her teklif için bir RouterWorkerOfferRevoked olayı alırsınız.
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);
Dekont
Bir çalışan 7 günden uzun süre kayıtlı ve boşta kalırsa, otomatik olarak kaydı kaldırılır. Kaydı kaldırıldıktan sonra, çalışanın durumu draining
bir veya daha fazla işin hala atandığı veya inactive
hiçbir işin atanmadığı durumdur.