通常应用系统中会存在一些工作流编排、执行和控制场景,同时还要对流程的状态,数据进行记录和管理。bamboo-engine 可以帮助系统满足上述的这些需求,它是一个应用层流程引擎,可以解析,执行,调度由用户创建的流程任务(有向有环图),并提供了如暂停,撤销,跳过,强制失败,重试和重入等等灵活的控制能力和并行、子流程等进阶特性,并可通过水平扩展来进一步提升任务的并发处理能力,该 SDK 目前已经在蓝鲸智云多个产品的生产环境中落地使用。

1. bamboo-engine 能做什么

在介绍 bamboo-engine 前,我们需要给流程流程引擎下个定义:

  • 流程:为了达成某个目标的一系列相互关联,有组织的活动或任务
  • 流程引擎:能够驱动流程推进的系统

而 bamboo-engine 的能力如下:

  1. 定义了流程的描述规则
  2. 提供了流程解析,执行,调度的能力
  3. 提供了灵活的流程控制能力
  4. 提供了流程活动定义和扩展的能力
  5. 提供了流程内部数据交换的模型和能力

下文会对每个能力进行简单的介绍:

1.1. 流程的描述规则

在 bamboo-engine 中,使用 JSON 来描述一个流程结构。

c1.1_flow.png

上图所示的一个简单流程,描述数据如下:

c1.1_flow_data.png

描述数据中主要记录了流程的开始和结束节点、活动节点、网关、连接节点的顺序流以及流程的上下文数据。由于记录的信息较多,所以流程数据比较冗长,但实际使用中并不需要手动构造这些数据,可以通过引擎提供的 builder 来以代码的形式声明并生成流程数据,具体可参考流程编排说明流程构造器使用说明

1.2. 流程解析,执行,调度能力

在拥有了上一节所描述的流程数据后,就可以通过引擎提供的 API 来执行和调度该流程,在引擎默认提供的运行时中,流程执行请求提交后,流程会以异步的方式被拉起和执行,引擎会对正在执行的多个流程进行协调和调度,开发者能够通过 API 来查询流程的执行状态和数据。

1.3. 灵活的流程控制能力

bamboo-engine 提供了两种类型的流程控制能力:

  1. 流程内控制:通过 网关(分支网关,并行网关及条件并行网关)打回(构造环状结构) 来在流程内部自动控制流程的推进
  2. 流程外控制:通过引擎 API 来在系统外部主动干预和控制流程的执行,引擎提供的控制能力有:
    • 暂停、继续、撤销流程
    • 预约暂停、继续、重试、跳过、强制失败、回调流程内部节点

1.4. 流程活动定义和扩展的能力

在实际使用中,除了能够自由编排流程的结构,我们还需要自定义流程节点执行逻辑的能力,bamboo-engine 提供了流程活动节点逻辑自定义框架,允许我们按照如下模式来定义节点的执行逻辑:

c1.4_custom_component.png

更多信息请参考自定义组件说明

1.5. 流程内部数据交换的模型和能力

bamboo-engine 定义了两种数据模型:

  • 执行数据:每个节点都都拥有一个执行数据,用于存储该节点的输入和输出
  • 流程上下文:每个流程/子流程都拥有一个流程上下文,负责处理流程执行时的数据交换

在整个流程执行的过程中,节点之间并不是完全孤立的,某些时候节点需要进行通信,例如,买家付款 节点需要获取 买家下单 节点的执行结果,由于在一个流程中每个节点之间的数据是相互隔离的,无法在节点内直接访问其他节点的执行数据,这时候就需要借助上下文来进行数据交换,如下图所示:

c1.5_context.png

为什么不能在节点中直接访问其他节点与上下文的数据?在节点中直接访问其他节点与上下文中的数据固然方便,但是这样可能会导致在实现组件时过度依赖当前上下文的结构与流程结构,从而破坏了组件的独立性与可复用性。引擎中的每种活动节点都是独立的个体,即:无论在什么结构下的流程中、在流程中的什么位置都能够正确的执行。

更多信息请参考数据交换说明

2. bamboo-engine 的设计

2.1. 整体设计

bamboo-engine 由 引擎运行时接口 两个部分构成。

引擎模块负责实现流程的核心调度逻辑,即流程的推进逻辑、每种类型节点的处理逻辑、流程的调度切换逻辑等。

实现了运行时接口的引擎运行时向引擎提供流程运行时数据存储、流程进程管理、任务派发的实现,两者的关系如下图所示:

c2.1_default_runtime.png

bamboo-engine 默认提供了基于 Django,Celery,MySQL 实现的运行时,能够方便的集成到 Django 应用中,使用 Celery 作为流程调度任务队列的实现,引擎运行时数据则存储到 MySQL 中:

c2.1_design.png

2.2. 可替换运行时

bamboo-engine 定义了 引擎运行时接口,如果默认提供的运行时在某些方面无法满足项目的需求,可以考虑根据接口实现自定义运行时:运行时接口

3. 如何监控 bamboo-engine 的运行状态

bamboo-engine 的 metrics 分为两部分:

  • engine:由 bamboo-engine 自身记录的 metrics
  • engine_runtime:由运行时实现负责记录的 metrics

关于 metrics 的介绍及配置请参考引擎监控说明

4. benchmark

由于是单机本地测试,机器本身性能指标数据参考意义不大,故此处不提供

测试环境:

  • 运行时:默认运行时
  • MacBook Pro(16 英寸,2019)
  • 处理器:2.6 GHz 六核Intel Core i7
  • 内存:32 GB 2667 MHz DDR4
  • OS:macOS Big Sur 11.2.1
  • Broker:RabbitMQ 3.8.2
  • MySQL:5.7.22
  • worker 启动命令(单个 worker 进程 -c 参数不变,通过增加进程来提高并发处理能力)
- `python manage.py celery worker -c 100 -P gevent -l info -Q er_execute -n execute_%(process_num)02d`
- `python manage.py celery worker -c 100 -P gevent -l info -Q er_schedule -n schedule_%(process_num)02d`
测试场景 worker concurrency 流程执行耗时(s)
100个流程(单流程17个节点)并发执行 100 25.98
100个流程(单流程17个节点)并发执行 200 14.75
100个流程(单流程17个节点)并发执行 500 8.29
100个流程(单流程17个节点)并发执行 1000 6.78
1000节点大流程 100 19.33
1000节点大流程 200 12.5
1000节点大流程 500 11
1000节点大流程 1000 7.5

下载体验

蓝鲸智云社区版:点击这里

文章来源于腾讯云开发者社区,点击查看原文