前言
公司上线asynq队列服务已经有两个月了,用得一直很好,比较稳定,目前只用了三台服务器跑任务,任务类型随着业务不断的切到asynq上,队列上的任务类型也越来越多,考虑把一些重要的任务的优先级提高一下,研究一下官方文档,看如何为不同的任务类型配置asynq的任务优先级
一、Asynq是什么?
Asynq是一个go语言实现的分布式任务队列和异步处理库,在这里如果有不了解的同学强烈推荐用一用,用了之后我相信你肯定会喜欢上这个产品,用go语言开发,轻量,稳定,功能强大,易用,分布式,你想要的功能它都有。
如果还不了解了请移步可以看一下原来发布的asynq安装教程
二、Asynq队列优先级
本步骤说明如何配置异步后台处理以满足您的需求。
1、加权优先级
默认情况下,Asynq Server 将创建一个名为“default”的队列来处理您的所有任务。
如果需要为每个任务分配优先级,可以创建多个具有不同优先级的队列。
例子:
代码如下(示例):
srv := asynq.NewServer(redis, asynq.Config{
Concurrency: 10,
Queues: map[string]int{
"critical": 6,
"default": 3,
"low": 1,
},
})
Asynq将创建一个具有三个队列的 Background 实例:critical、default 和 low。 与队列名称关联的数字是队列的优先级。
使用上述配置:
关键队列中的任务将被处理 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 命令检查队列。
您可以在输出的“QUEUES”部分查看每个队列中的任务数。
2、开启严格优先
如果您需要创建多个队列并且有严格的优先顺序,则可以使用 StrictPriority 选项。
代码如下(示例):
srv := asynq.NewServer(redis, asynq.Config{
Concurrency: 10,
Queues: map[string]uint{
"critical": 3,
"default": 2,
"low": 1,
},
StrictPriority: true, // strict mode!
})
这将创建一个具有三个队列的后台实例:关键critical、默认default和低优先级low。 在严格优先级模式下,总是先处理优先级高的队列,只有当所有其他优先级高的队列都为空时,才会处理优先级低的队列。
所以在这个例子中,关键队列critical中的任务总是首先被处理。 如果关键队列为空,则处理默认队列default。 如果关键队列和默认队列都为空,则处理低队列low。
总结
asynq队列队列优先级配置让我们可以安照业务的实际优先级把不同的任务放入不同的队列,解决了队列有优先级要求的场景。