このページでは、asynqを使用してバックグラウンド処理の優先度を設定する方法について説明します。

重み付けされた優先度

デフォルトでは、Server はすべてのタスクを処理するために "default" という名前のキューを作成します。

各タスクに優先度を割り当てる必要がある場合は、異なる優先度レベルを持つ複数のキューを作成できます。

例:

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

これにより、criticaldefault、およびlow の3つのキューを持つ Background のインスタンスが作成されます。キュー名に関連付けられた数値はキューの優先度レベルを表します。

上記の構成に基づいて:

  • critical キューのタスクは60%の確率で処理されます
  • default キューのタスクは30%の確率で処理されます
  • low キューのタスクは10%の確率で処理されます

これで、異なる優先度レベルを持つ複数のキューができたので、タスクをスケジュールする際にどのキューを使用するかを指定できます。

例:

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

// "critical" キューを使用するようにタスクをスケジュールするために `asynq.Queue` オプションを使用します。
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, // 厳密なモード!
})

これにより、厳密な優先度を持つ criticaldefault、およびlowの3つのキューを持つ Background のインスタンスが作成されます。厳密な優先度モードでは、高い優先度を持つキューは常に最初に処理され、低い優先度のキューは他の高い優先度のキューが空でない場合にのみ処理されます。

したがって、この例では critical キューのタスクが常に最初に処理されます。 critical キューが空であれば default キューが処理されます。 critical および default キューが空であれば low キューが処理されます。