Жизненный цикл задачи

Асинхронные задачи проходят через несколько состояний в течение своего жизненного цикла. На этой странице фиксируется жизненный цикл задачи от создания до удаления.

При постановке задачи в очередь, 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
                                  |                       |
                                  |                       |
                           +------+-------+               |        +--------------+
                           |              |               |        |              |
                           |    Повтор     |<--------------+------->|   Архивировано   |
                           |              |                        |              |
                           +--------------+                        +--------------+