异步任务在其生命周期中经历了多个状态。本页面记录了任务的从创建到删除的生命周期。
任务生命周期
当您将任务加入队列时,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
将在未来的24小时内保持在已安排状态。24小时后,它将转换为待处理状态,然后转换为活动状态。如果任务成功处理,则任务数据将从Redis中删除。如果任务未成功处理(即处理程序返回错误或发生恐慌),则任务将转换为重试状态以便稍后重试。在一段时间后,任务将再次转换为待处理状态,然后转换为活动状态。此循环将持续进行,直到任务成功处理或任务耗尽重试次数为止。在后一种情况下,任务将转换为已归档状态。
在这个例子中,任务2
和任务1
的唯一区别在于任务2
将跳过已安排状态,直接进入待处理状态。
任务3
以2小时的保留选项入队。这意味着在一个工作器成功处理了任务3
之后,任务将保持在已完成状态的队列中,持续2小时,然后从队列中删除。默认情况下,如果任务没有设置保留选项,那么任务在完成后将立即被删除。
下图显示了状态转换的图示。
+-------------+ +--------------+ +--------------+ +-------------+
| | | | | | Success | |
| Scheduled |----------->| Pending |--------->| Active |---------> | Completed |
| (Optional) | | | | | | (Optional) |
+-------------+ +--------------+ +--------------+ +-------------+
^ | |
| | | Deletion
| | Failed |
| | V
| |
| |
+------+-------+ | +--------------+
| | | | |
| Retry |<--------------+------->| Archived |
| | | |
+--------------+ +--------------+