이 페이지에서는 asynq를 사용하여 배경 처리의 우선 순위를 구성하는 방법을 설명합니다.

가중치 기반 우선 순위

기본적으로 Server는 모든 작업을 처리하기 위해 "default"라는 이름의 대기열을 생성합니다.

각 작업에 우선 순위를 할당해야 하는 경우, 서로 다른 우선 순위 수준을 가진 여러 대기열을 생성할 수 있습니다.

예시:

srv := asynq.NewServer(redis, asynq.Config{
    Concurrency: 10,
    Queues: map[string]int{
        "critical": 6,
        "default":  3,
        "low":      1,
    },
})

위 구성에서는 critical, default, low 세 개의 대기열을 가진 Background 인스턴스가 생성됩니다. 대기열 이름과 관련된 숫자는 대기열의 우선 순위 수준을 나타냅니다.

위의 구성을 기반으로:

  • critical 대기열의 작업은 시스템 전체 작업의 60%를 처리합니다.
  • default 대기열의 작업은 시스템 전체 작업의 30%를 처리합니다.
  • low 대기열의 작업은 시스템 전체 작업의 10%를 처리합니다.

이제 여러 우선 순위 수준을 가진 여러 대기열을 가지고 있으므로 작업을 예약할 때 어떤 대기열을 사용할지 지정할 수 있습니다.

예시:

client := asynq.NewClient(redis)
task := asynq.NewTask("send_notification", map[string]interface{}{"user_id": 42})

// "critical" 대기열을 사용해 작업을 예약하려면 `asynq.Queue` 옵션을 사용합니다.
err := client.Enqueue(task, asynq.Queue("critical"))

// 기본적으로 작업은 "default" 대기열에 예약됩니다.
err = client.Enqueue(task)

asynq stats 명령을 사용하여 대기열을 확인할 수 있습니다.

출력의 "QUEUES" 섹션에서 각 대기열의 작업 수를 확인할 수 있습니다.

엄격한 우선 순위

여러 대기열을 생성하고 한 대기열의 모든 작업을 더 높은 우선 순위로 처리하려면 StrictPriority 옵션을 사용하면 됩니다.

예시:

srv := asynq.NewServer(redis, asynq.Config{
    Concurrency: 10,
    Queues: map[string]int{
        "critical": 3,
        "default":  2,
        "low":      1,
    },
    StrictPriority: true, // 엄격한 모드!
})

위의 구성은 critical, default, low 세 개의 대기열과 엄격한 우선 순위를 가진 Background 인스턴스를 생성합니다. 엄격한 우선 순위 모드에서는 더 높은 우선 순위의 대기열이 항상 먼저 처리되고, 다른 모든 더 낮은 우선 순위 대기열이 비어 있을 때에만 더 낮은 우선 순위 대기열이 처리됩니다.

따라서 이 예시에서 critical 대기열의 작업은 항상 먼저 처리됩니다. critical 대기열이 비어 있으면 default 대기열이 처리됩니다. criticaldefault 대기열이 모두 비어 있으면 low 대기열이 처리됩니다.