Esta página explicará cómo configurar la prioridad del procesamiento en segundo plano con asynq para satisfacer sus necesidades.

Prioridad ponderada

Por defecto, Server creará una cola llamada "default" para procesar todas las tareas.

Si necesita asignar prioridades a cada tarea, puede crear múltiples colas con diferentes niveles de prioridad.

Ejemplo:

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

Esto creará una instancia de Background con tres colas: critical, default y low. Los números asociados con los nombres de las colas representan el nivel de prioridad de las colas.

Con base en la configuración anterior:

  • Las tareas en la cola critical se procesarán el 60% del tiempo.
  • Las tareas en la cola default se procesarán el 30% del tiempo.
  • Las tareas en la cola low se procesarán el 10% del tiempo.

Ahora que tenemos múltiples colas con diferentes niveles de prioridad, podemos especificar qué cola utilizar al programar tareas.

Ejemplo:

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

// Use la opción `asynq.Queue` para especificar que una tarea use la cola "critical".
err := client.Enqueue(task, asynq.Queue("critical"))

// Por defecto, las tareas se encolarán en la cola "default".
err = client.Enqueue(task)

Con el comando asynq stats, podemos verificar las colas.

Puede ver el número de tareas en cada cola en la sección "QUEUES" de la salida.

Prioridad estricta

Si necesita crear múltiples colas y quiere que todas las tareas en una cola se procesen con mayor prioridad, puede usar la opción StrictPriority.

Ejemplo:

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

Esto creará una instancia de Background con tres colas y prioridad estricta: critical, default y low. En modo de prioridad estricta, las colas con mayor prioridad siempre se procesarán primero, y las colas de menor prioridad solo se procesarán si todas las demás colas de mayor prioridad están vacías.

Por lo tanto, en este ejemplo, las tareas en la cola critical siempre se procesarán primero. Si la cola critical está vacía, se procesará la cola default. Si tanto las colas critical como default están vacías, se procesará la cola low.