本页面将说明如何配置asynq
后台处理优先级以满足您的需求。
加权优先级
默认情况下,Server
将创建一个名为”default”的队列来处理所有任务。
如果您需要为每个任务分配优先级,可以创建具有不同优先级级别的多个队列。
示例:
srv := asynq.NewServer(redis, asynq.Config{
Concurrency: 10,
Queues: map[string]int{
"critical": 6,
"default": 3,
"low": 1,
},
})
这将创建一个具有三个队列的Background
实例:critical,default和low。与队列名称关联的数字是队列的优先级级别。
根据以上配置:
- critical队列中的任务将60%的时间进行处理
- default队列中的任务将30%的时间进行处理
- low队列中的任务将10%的时间进行处理
既然我们有了具有不同优先级级别的多个队列,我们可以在调度任务时指定使用哪个队列。
示例:
client := asynq.NewClient(redis)
task := asynq.NewTask("send_notification", map[string]interface{}{"user_id": 42})
// 使用`asynq.Queue`选项指定一个任务使用"critical"队列。
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, // 严格模式!
})
这将创建一个具有严格优先级的三个队列的Background
实例:critical,default和low。在严格优先级模式下,具有更高优先级的队列始终先处理,只有在所有其他优先级更高的队列为空时,才会处理优先级较低的队列。
因此,在此示例中,始终首先处理critical队列中的任务。如果critical队列为空,则处理default队列。如果critical和default队列都为空,则处理low队列。