이 페이지에서는 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 대기열이 처리됩니다. critical와 default 대기열이 모두 비어 있으면 low 대기열이 처리됩니다.