Aracılığıyla paylaş


İş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 activedeğiştirilir.

Aşağıdaki örnekte, bir çalışanı şu şekilde kaydederiz:

  • ve'i queue-1 dinleme queue-2
  • Hem ses hem de sohbet kanallarını işleyebilme. Bu durumda, çalışan bir kerede tek voice bir işi veya aynı anda iki chat 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 queue1gider.
  • Kanal için chat .
  • Bu işe hizmet veren herhangi bir çalışanın olarak ayarlanmış truebir etiketi English 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şulun Skill süresinin bir dakika sonra dolacağını belirten bir çalışan seçicisi ile.
  • etiketi name olarak ayarlanmıştır 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"))));

İş 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 10olur. 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 AvailableForOffersfalse 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.