Взвешенный приоритет
По умолчанию 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.