Questa pagina spiegherà come configurare la priorità del processing in background con asynq per soddisfare le tue esigenze.

Priorità ponderata

Per impostazione predefinita, Server creerà una coda chiamata "default" per elaborare tutti i task.

Se hai bisogno di assegnare priorità a ogni task, puoi creare più code con diversi livelli di priorità.

Esempio:

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

Questo creerà un'istanza di Background con tre code: critical, default e low. I numeri associati ai nomi delle code rappresentano il livello di priorità delle code.

In base alla configurazione sopra:

  • I task nella coda critical verranno elaborati il 60% del tempo.
  • I task nella coda default verranno elaborati il 30% del tempo.
  • I task nella coda low verranno elaborati il 10% del tempo.

Ora che abbiamo più code con diversi livelli di priorità, possiamo specificare quale coda utilizzare quando si pianificano i task.

Esempio:

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

// Utilizza l'opzione `asynq.Queue` per specificare un task da utilizzare nella coda "critical".
err := client.Enqueue(task, asynq.Queue("critical"))

// Per impostazione predefinita, i task verranno inseriti nella coda "default".
err = client.Enqueue(task)

Con il comando asynq stats, possiamo controllare le code.

È possibile visualizzare il numero di task in ciascuna coda nella sezione "FILE" dell'output.

Priorità rigida

Se è necessario creare più code e si desidera che tutti i task in una coda siano elaborati con priorità più alta, è possibile utilizzare l'opzione StrictPriority.

Esempio:

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

Questo creerà un'istanza di Background con tre code e priorità rigorosa: critical, default e low. In modalità di priorità rigorosa, le code con priorità più alta verranno sempre elaborate per prime e le code con priorità più bassa verranno elaborate solo se tutte le altre code con priorità più alta sono vuote.

Pertanto, in questo esempio, i task nella coda critical verranno sempre elaborati per primi. Se la coda critical è vuota, verrà elaborata la coda default. Se sia la coda critical che la coda default sono vuote, verrà elaborata la coda low.