asynq队列的优先级

程序员卷不动了 2023-03-21 PM 699℃ 0条

加权优先级

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

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

例子:

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

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

使用上述配置:

  • 关键队列中的任务将有60%的时间得到处理
  • 默认队列中的任务将有30%的时间被处理
  • 队列中的任务将有10%的时间被处理

现在我们有多个具有不同优先级的队列,我们可以指定在调度任务时使用哪个队列。

例子:

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

// Specify a task to use "critical" queue using `asynq.Queue` option.
err := client.Enqueue(task, asynq.Queue("critical"))

// By default, task will be enqueued to "default" queue.
err = client.Enqueue(task)

我们可以使用asynq stats命令检查队列。

asynq stats 命令的输出

您可以在输出的“QUEUES”部分看到每个队列中的任务数。

严格优先

如果你需要创建多个队列并且需要处理一个队列中的所有任务而不是其他队列,你可以使用StrictPriority选项。

例子:

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

这将创建一个Background具有三个队列的实例:criticaldefault和具有严格优先级的低。在严格优先级模式下,优先级高的队列总是先被处理,只有当所有其他优先级高的队列都为空时,低优先级的队列才会被处理。

所以在这个例子中,关键队列中的任务总是首先被处理。如果关键队列为空,则处理默认队列。如果关键队列默认队列都为空,则处理低队列。

标签: asynq

非特殊说明,本博所有文章均为博主原创。

评论啦~