为什么建设统一处置平台
内容治理的最后一步,是把决策变成实际动作:更新标签、发起审核、执行治理、通知相关方。早期,这些动作分散在各个业务服务里,由调用方自行串联下游接口。
随着接入方从生态内部扩展到商业化、电商、生服和搜索,问题逐渐变成了平台问题。同一种能力出现多套实现,执行顺序、失败重试和故障恢复各自处理,接入、对账与仲裁也缺少统一的边界。
处置平台的目标,是让业务通过统一的语义表达处置意图,由平台承接后续执行。它既收敛下游能力,也让执行记录、异常处理和多业务协作有共同的落点。
从受理请求到异步完成
平台采用异步事件驱动的执行架构。入口仍有请求与响应,但请求返回不需要等待所有下游动作完成。任务进入事件链路后,由执行器和恢复服务持续推进。
这里必须区分两件事:网关受理成功,表示平台接下了任务;任务完成,表示要求执行的动作已经收敛到完成状态。 对调用方简化接口,并不意味着平台可以忽略这两个时间点之间的责任。
整体可以分为三层:SDK 与 Cell 表达业务意图;网关组织任务并投递事件;执行器与回溯服务负责执行和恢复。对账与仲裁属于统一平台的治理能力,本篇不为其补画未经展开的内部实现。
用 Cell 表达业务,用 DAG 组织执行
Cell 是面向业务的最小执行单元。调用方表达的是“更新内容质量等级”或“发起审核”,而不是修改哪个底层字段、调用哪个执行器。
SDK 屏蔽 action、executor 等实现概念,并允许组合多个 Cell。一个业务动作在内部可以展开为多个执行步骤;这些步骤按依赖构建 DAG。两层抽象解决不同的问题:Cell 让接入方理解业务能力,DAG 让平台理解执行顺序。
网关产生的任务描述包含身份与编排信息、业务载荷、动作集合以及重试状态。执行器按照依赖推进节点,为各子任务维护状态机。
假设动作 B 依赖 A:A 失败时,B 记录为依赖异常;与 A 无依赖的其他节点可以完成。这样一次任务失败后,平台仍然知道哪些工作已经完成,哪些执行失败,哪些尚未具备执行条件。
状态随事件流转,恢复从断点继续
这套设计的一个特点,是把子任务状态保留在任务 Schema 中,让状态随着事件在队列之间流转。再次到达执行器时,根据已有状态决定哪些节点需要继续执行。
它不同于失败后从头重跑整个业务请求。恢复的单位是尚未完成、且依赖条件满足的子任务;已经记录成功的节点不应被无条件重复执行。
不过,跳过已记录成功的节点,不等于任意外部副作用都天然幂等。 下游已经执行、但结果尚未记录就发生中断时,仍然可能遇到结果不确定。理解这一机制时,需要把平台内的状态恢复与下游动作自身的幂等约束分开看,不能仅凭“有状态机”就推导出 exactly-once。
三类事件与两种恢复节奏
平台没有把所有失败交给同一种 MQ 自动重试,而是通过三类事件区分处理节奏。
| 事件 | 职责 | 后续处理 |
|---|---|---|
task.create |
承载新任务与可以继续执行的任务 | 执行器消费;偶发失败时携带更新后的状态做有限次重试 |
task.fail |
承载短期重试仍未成功的任务 | 交由 Ekko 判断恢复时机,延迟或重新投递 |
task.demote |
承载被降级的任务 | 暂缓相关动作,待下游恢复后再推进 |
短期重试用于吸收抖动和偶发超时;回溯用于跨越更长时间的故障。两者分开之后,下游事故就不必变成持续的高频重试。
Ekko 是失败任务的回溯服务。它管理失败和降级任务,支持手动或自动重新投递。当下游恢复后,调整可重试状态,再把任务送回 task.create,由执行器沿正常路径继续执行。
这也说明,回溯不应是另一套业务实现。它负责让任务重新具备执行条件,实际执行仍复用原来的 DAG 和执行器。
全异步架构真正需要守住的边界
事件驱动把时间上的耦合拆开了,也把正确性责任分散到了多个环节。审视这种架构,需要明确以下边界:
- 受理边界:返回成功时,任务是否已经进入可靠的处理链路;受理与投递之间的失败如何被发现。
- 执行边界:子动作的成功状态对应什么事实;超时能否判断外部结果;重复执行如何处理。
- 恢复边界:哪些失败值得立即重试,哪些应退避或降级;恢复回放如何避免再次冲击下游。
- 完成边界:任务完成、结果通知送达和外部状态对账是不同事实,需要分别判断。
这些是架构的检查问题,不是仅凭队列名称就能推导出的实现保证。历史设计明确呈现了事件分流、状态传递与断点恢复;具体存储原子性和下游幂等契约,需要结合各动作实现分析。
从执行能力走向统一平台
平台建设带来的长期价值,是让新增业务主要关注自己的 Cell 语义和接入契约,而不用重复建设任务执行、异常回溯等公共机制。
统一接入也为对账与仲裁提供了共同的任务身份和业务语境。但这不意味着把所有差异都塞进执行器:执行器负责执行,业务规则决定应该执行什么,治理能力负责解释和处理跨系统结果。
回看这段建设,最重要的演进是从“各业务自行调用接口”,走向“业务表达意图、平台异步兑现”。DAG 表达依赖,状态机保留进度,事件驱动推进任务,回溯机制让长时间故障之后仍有继续执行的路径。