Жизненный цикл задачи
Асинхронные задачи проходят через несколько состояний в течение своего жизненного цикла. На этой странице фиксируется жизненный цикл задачи от создания до удаления.
При постановке задачи в очередь, asynq внутренне управляет задачей, чтобы обеспечить вызов обработчика в указанное время. В процессе выполнения задача может проходить через различные состояния жизненного цикла.
Вот список различных состояний жизненного цикла:
-
Scheduled: Задача ожидает будущей обработки (применяется только к задачам с параметрами
ProcessAt
илиProcessIn
). - Pending: Задача готова к обработке и будет взята свободным работником.
- Active: Задача обрабатывается работником (т.е. обработчик обрабатывает задачу).
- Retry: Работник не может обработать задачу, и задача ожидает повторной попытки в будущем.
- Archived: Задача достигла максимального количества попыток повторов и сохранена в архиве для ручной проверки.
-
Completed: Задача успешно обработана и будет сохранена до истечения времени удержания (применяется только к задачам с параметром
Retention
).
Давайте рассмотрим различные состояния жизненного цикла на примере.
// Задача 1: Запланирована для обработки через 24 часа.
client.Enqueue(task1, asynq.ProcessIn(24*time.Hour))
// Задача 2: Поставлена в очередь для немедленной обработки.
client.Enqueue(task2)
// Задача 3: Поставлена в очередь с параметром удержания.
client.Enqueue(task3, asynq.Retention(2*time.Hour))
В этом примере Задача 1
будет находиться в состоянии Scheduled в течение следующих 24 часов. Через 24 часа она перейдет в состояние Pending, а затем в состояние Active. Если задача успешно обработана, данные задачи будут удалены из Redis. Если задача не будет успешно обработана (т.е. обработчик вернет ошибку или произойдет паника), задача перейдет в состояние Retry для последующих попыток. Через определенный период времени задача вернется в состояние Pending, затем в состояние Active. Этот цикл будет продолжаться до успешной обработки задачи или исчерпания попыток повтора. В последнем случае задача будет переведена в состояние Archived.
В этом примере единственное различие между Задачей 2
и Задачей 1
заключается в том, что Задача 2
пропускает состояние Scheduled и непосредственно переходит в состояние Pending.
Задача 3
поставлена в очередь с параметром удержания в 2 часа. Это означает, что после успешной обработки работником Задачи 3
, задача останется в состоянии Completed в течение 2 часов перед удалением из очереди. По умолчанию, если у задачи не установлен параметр удержания, она будет удалена из очереди сразу после завершения.
Диаграмма ниже иллюстрирует переходы состояний.
+-------------+ +--------------+ +--------------+ +-------------+
| | | | | | Успешно | |
| Запланировано |----------->| Ожидание |--------->| Активно |---------> | Завершено |
| (Опционально) | | | | | | (Опционально) |
+-------------+ +--------------+ +--------------+ +-------------+
^ | |
| | | Удаление
| | Неудача |
| | V
| |
| |
+------+-------+ | +--------------+
| | | | |
| Повтор |<--------------+------->| Архивировано |
| | | |
+--------------+ +--------------+