一架梯子,一头程序猿,仰望星空!
Asynq任务队列教程 > 内容正文

队列优先级


本页面将说明如何配置asynq后台处理优先级以满足您的需求。

加权优先级

默认情况下,Server将创建一个名为”default”的队列来处理所有任务。

如果您需要为每个任务分配优先级,可以创建具有不同优先级级别的多个队列。

示例:

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

这将创建一个具有三个队列的Background实例:criticaldefaultlow。与队列名称关联的数字是队列的优先级级别。

根据以上配置:

  • 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实例:criticaldefaultlow。在严格优先级模式下,具有更高优先级的队列始终先处理,只有在所有其他优先级更高的队列为空时,才会处理优先级较低的队列。

因此,在此示例中,始终首先处理critical队列中的任务。如果critical队列为空,则处理default队列。如果criticaldefault队列都为空,则处理low队列。