Взвешенный приоритет

По умолчанию 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.