작업을 작업자와 일치시키는 방법

이 문서에서는 작업자 등록, 작업 제출 및 서로 일치하는 방법을 설명합니다.

작업자 등록

작업자가 작업을 서비스하기 위한 제안을 받으려면 먼저 availableForOffers를 true로 설정하여 등록해야 합니다. 다음으로 작업자가 수신 대기하는 큐와 처리할 수 있는 채널을 지정해야 합니다. 등록되면 Event Grid에서 RouterWorkerRegistered 이벤트가 수신되고 작업자의 상태가 active로 변경됩니다.

다음 예제에서는 작업자를 등록합니다.

  • queue-1queue-2에서 수신 대기
  • 음성 및 채팅 채널을 모두 처리할 수 있어야 합니다. 이 경우 작업자는 한 번에 하나의 voice 작업을 수행하거나 동시에 두 개의 chat 작업을 수행할 수 있습니다. 이 설정은 작업자의 총 용량을 지정하고 각 채널에 대해 작업당 비용을 할당하여 구성됩니다.
  • 특정 작업과 일치하는지 확인하는 데 도움이 될 수 있는 작업자에 대한 내용을 설명하는 레이블 세트가 있습니다.
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"))));

작업 제출

다음 예제에서는 다음과 같은 작업을 제출합니다.

  • queue1로 직접 이동합니다.
  • chat 채널의 경우
  • 이 작업을 서비스하는 모든 작업자가 true로 설정된 English 레이블이 있어야 하도록 지정하는 작업자 선택기를 사용합니다.
  • 이 작업을 서비스하는 모든 작업자는 10보다 큰 Skill 레이블을 가져야 하며 이 조건은 1분 후에 만료되도록 지정하는 작업자 선택기를 사용합니다.
  • name 레이블을 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"))));

작업 라우터는 이제 이 작업을 chat 채널에 대해 queue1에서 수신 대기 중인 사용 가능한 작업자와 이 작업을 일치시키려고 시도합니다. 이때 English10보다 큰 trueSkill로 설정되고 설정됩니다. 일치 항목이 만들어지면 제품이 만들어집니다. 큐에 연결된 배포 정책은 작업에 사용할 수 있는 활성 제품 수와 각 제품의 유효 기간을 제어합니다. 다음과 같은 OfferIssued 이벤트표시됩니다.

{
    "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 이벤트에는 작업, 작업자, 제품 유효 기간 및 작업을 수락하거나 거절하는 데 필요한 offerId에 대한 세부 정보가 포함됩니다.

참고 항목

작업의 최대 수명은 90일이며 그 후에는 자동으로 만료됩니다.

작업자 등록 취소

작업자가 제안 수신을 중지하려는 경우 작업자를 업데이트할 때 AvailableForOffersfalse로 설정하여 등록을 취소할 수 있으며 Event Grid에서 RouterWorkerDeregistered 이벤트를 받을 수 있습니다. 작업자에 대한 기존 제안은 해지되며 각 제안에 대한 RouterWorkerOfferRevoked 이벤트를 받습니다.

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);

참고 항목

작업자가 등록되어 7일 넘게 유휴 상태이면 자동으로 등록이 취소됩니다. 등록이 취소되면 하나 이상의 작업이 여전히 할당된 경우 작업자의 상태는 draining이거나 할당된 작업이 없는 경우 inactive입니다.