外观
Operations DAG 如何组织异步工作?
项目版本说明
这些问答整合历史设计与实现资料;当前 main 分支 README 以工作包描述建设状态。具体能力、实验数据与设计目标的边界见项目状态与证据。
标准回答
一次业务操作可以拆成有依赖关系的任务,例如先提取再泛化或生成向量。DAG 表达前置关系,任务状态保存在数据库,Worker 领取已满足依赖的工作。这样进程重启后可以继续判断哪些完成、哪些待处理,而不依赖某个内存 goroutine 是否还在。
当前代码在领取前检查任务状态、not-before、未完成依赖、Space 状态和来源是否仍有效。任务具有 leased、retry_wait、commit_pending、succeeded、dead、canceled 等运行状态,失败不是简单回到一个无限重试队列。
需要区分操作完成与某一个任务完成。依赖图过细会增加调度与事务成本,过粗则难以复用和诊断;拆分粒度应以独立失败、重试和提交边界为依据。不能从“使用 DAG”推导出无限并行能力。
追问与回答
上游失败后下游应该怎么办
根据失败类别决定等待重试、取消或进入终止态,不能在输入未成立时继续运行。报告应给出阻止推进的具体依赖。
为什么不用内存队列先做完
短任务可以更简单,但长任务和进程故障需要持久进度。选择持久调度是为恢复和治理付出复杂度,并非任何小功能都必须用 DAG。
易混淆点
- 用提交到线程池表示任务已经可靠持久化。
内容来源
- Android 与 AI 工程 Wiki · 原条目
q152