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.