Ta strona wyjaśni, jak skonfigurować priorytet przetwarzania w tle z asynq, aby sprostać Twoim potrzebom.

Priorytet ważony

Domyślnie Server utworzy kolejkę o nazwie “default” do przetwarzania wszystkich zadań.

Jeśli chcesz przypisać priorytety do każdego zadania, możesz utworzyć wiele kolejek o różnym poziomie priorytetu.

Przykład:

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

To spowoduje utworzenie instancji Background z trzema kolejkami: critical, default i low. Liczby przypisane do nazw kolejek reprezentują poziom priorytetu kolejek.

Na podstawie powyższej konfiguracji:

  • Zadania w kolejce critical będą przetwarzane 60% czasu
  • Zadania w kolejce default będą przetwarzane 30% czasu
  • Zadania w kolejce low będą przetwarzane 10% czasu

Teraz, gdy mamy wiele kolejek o różnym poziomie priorytetu, możemy określić, która kolejka ma być używana podczas planowania zadań.

Przykład:

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

// Użyj opcji `asynq.Queue` do określenia, że zadanie ma być używane w kolejce "critical".
err := client.Enqueue(task, asynq.Queue("critical"))

// Domyślnie zadania będą dodawane do kolejki "default".
err = client.Enqueue(task)

Za pomocą polecenia asynq stats możemy sprawdzić kolejki.

Możesz zobaczyć liczbę zadań w każdej kolejce w sekcji “QUEUES” wyniku.

Ścisły priorytet

Jeśli musisz utworzyć wiele kolejek i chcesz, aby wszystkie zadania w jednej kolejce były przetwarzane z wyższym priorytetem, możesz użyć opcji StrictPriority.

Przykład:

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

To spowoduje utworzenie instancji Background z trzema kolejkami i ścisłym priorytetem: critical, default i low. W trybie ścisłym priorytetu kolejki z wyższym priorytetem zawsze będą przetwarzane jako pierwsze, a kolejki o niższym priorytecie będą przetwarzane tylko wtedy, gdy wszystkie inne kolejki o wyższym priorytecie będą puste.

Dlatego w tym przykładzie zadania z kolejki critical zawsze będą przetwarzane jako pierwsze. Jeśli kolejka critical będzie pusta, przetworzona zostanie kolejka default. Jeśli zarówno kolejki critical, jak i default będą puste, przetworzona zostanie kolejka low.