异步任务框架设计

背景

开发平台类的管控程序时,我们常常会遇到以下的一些问题:

  • 同步等待影响体验:依赖外部调用的时候,同步等待将使得用户阻塞在某个操作,影响体验
  • 复杂的业务流程由多个子阶段构成:复杂业务由多个子阶段构成,并且阶段的推进依赖一些条件
  • 子阶段的重试:子阶段可能执行失败,在更新的 sub task 维度进行任务重试,避免重做整个工作流

针对这种通用场景,通过设计一个异步任务框架可以解决这类问题。

Tips: 虽然异步任务框架也涉及工作流引擎的部分能力,例如工作流定义和基于条件的流转,但是本质上还是和ActivitiZeebe这种支持 BPM 建模的工作流引擎有非常大的不同。广义上的工作流引擎必然包含可视化的工作流编排,会直接面向终端用户的使用,而我们此处讨论的异步任务框架的工作流则是服务于开发人员和代码的,因此设计思路上也会和广义上的工作流引擎有很大差异,这个需要注意。

总体设计

基本要素

  • 面向的使用对象:开发者
  • 面向的场景:
    • 单机场景
    • 基于代码的相对固化的工作流(可以有多阶段和推进条件)
  • 核心能力:
    • 异步工作流:通过定义核心流程、条件可以迅速通过代码构建起一个异步工作流
    • 状态机:用于推动状态的流转

设计思路

笔者职业生涯中开发过的几款中间件平台均涉及异步任务框架。具体展开会涉及相关产品,不方便讨论。因此这边主要还是总结下思路。

  • 通过数据库的表来管理阶段和状态
  • 代码层面做好任务、子任务、条件等的抽象。如何抽象,可以适当借鉴一些 BPMN 的定义。

参考资料

  • 【公众号】一文读懂微服务编排利器—Zeebe