共计 4664 个字符,预计需要花费 12 分钟才能阅读完成。
作者:vivo 互联网服务器团队 - Cheng Wangrong
本文是《vivo 营销自动化技术解密》的第 4 篇文章,剖析了在营销自动化业务引入工作流技术的背景和工作流引擎的介绍,同时介绍了几种业界风行的开源工作流引擎特点,以及在我的项目自研开发过程中的设计思路和总结思考。
《vivo 营销自动化技术解密》系列文章:
vivo 营销自动化技术解密|开篇
设计模式如何晋升 vivo 营销自动化业务扩展性 | 引擎篇 01
状态机引擎在 vivo 营销自动化中的深度实际 | 引擎篇 02
一、业务背景
营销自动化平台能够反对不同用户生命周期的流动旅程策略配置,依据用户触发的不同流动行为,进行差异化的营销触达计划。同时各种类型流动的具体执行过程中也有不同的业务解决流程(比方审批流程和业务流转)。
业务流程简单多样,需要变更频繁,我的项目开发过程中会有以下痛点:
- 我的项目交付周期长:一个残缺的业务流程须要从头开始按版本迭代,开发工夫长,老本高。
- 性能反复开发测试:业务之间会掺杂着很多共性的流程,导致大量重复性开发测试工作,效率低。
- 保护老本高:随着我的项目业务的逐渐倒退,业务流程逐渐积攒,可维护性降落,零碎改变牵一发而动全身。
如何将业务逻辑从控制流中剥离进去,让产研人员更聚焦于业务的实现是须要重点解决的问题。而传统 OA 畛域应用的是久经考验的业务流程治理解决方案 —— 工作流(Workflow)。工作流是一套工业级的解决方案,由工作流治理联盟(WfMC)制订了一系列的规范。
二、工作流介绍
2.1 工作流定义
工作流(Workflow)—— 对工作流程及其各操作步骤之间业务规定的形象,将流程中的工作组织逻辑和规定进行建模,交由计算机进行主动解决。
工作流的 实质思维 是:通过预约义的工作流程模板,对事实流动进行实例化的过程。简略说就是通过预设的格局或者可视化配置好流程的模板(比方一种分享流动的运行流程模板),应用时通过该模板结构出一个流程实例对象,通过实例对象实现流动运行跟踪和回溯。
2.2 工作流参考模型
WfMC 工作流治理联盟为工作流制订了参考模型,其外围就是两头的工作流引擎,工作流引擎提供流程定义工具(接口 1)、给使用者提供信息查问(接口 2)、调用内部利用(接口 3)、整合其余工作流(接口 4)和监控治理(接口 5)的能力。对于大多数工作流产品而言,重点关注的是接口 1 和接口 2 的实现。
2.3 工作流引擎要害个性
- 流程可视化
提供可视化的流程搭建,流程视图查看能力,以及实时观测工作运行能力。
- 业务可编排复用
将公共业务进行组件化,能够反对工作的自在编排,自在搭建出适宜的业务的不同流程。
- 业务和管制拆散
将流程的管制(如流转、判断、循环、重试等)的工作交由工作流负责,让使用者聚焦于外围业务逻辑。
2.4 工作流引擎的类型
对于工作流的类型没有专门的规范,依照流程工作节点个性能够分为:
- 程序工作流
程序工作流的运行形式相似一种特定的流程图,上一个流程工作实现后顺次进入下一个流程工作,过程不可逆。
- 状态机工作流
状态机工作流偏重关注的是流程工作的状态,驱使工作状态发生变化的因素个别为内部事件,即事件驱动的形式,驱使工作节点从一个状态运行到另外一个状态,节点间可逆。
- 规定驱动工作流
侧重于节点的运行规定,基于业务规定进行工作流程的执行,在解决具备明确指标但“规定”或标准级别不同的各种我的项目时,规定驱动的工作流十分有用。
能够看到不同类型的工作流不是齐全割裂的,状态机工作流中也能够联合着条件和规定进行操作节点转换的过程。在软件开发中,个别会思考联合状态机和规定驱动的工作流。
2.5 工作流引擎和状态机的差别
在之前的文章外面,咱们有对 状态机和工作流引擎 做过一次简略的 比照,事实上,两者之间并不是一个齐全对等的概念:
- 状态机 是零碎状态以及这些状态之间转移和动作等行为的数学计算模型,而 工作流 是对整体工作流程及其各操作步骤之间业务逻辑和规定的形象建模。
- 状态机 模式是事件驱动型,大多通过内部事件触发状态的主动流转;工作流引擎 更侧重于形容预约义流程工作实现之后的主动流转,可预测性会更强。
- 从实用场景的复杂性上看,间接应用 状态机 的形式能够清晰地描绘出所有可能的状态以及导致转换的事件,实用于解决单维度、复杂度不高的业务问题,施展灵便轻便的特点;工作流引擎 则更适宜简单的业务流程治理,解决如大型 CRM 复杂度更高的流程自动化问题,聚焦于改善整体业务流程的效率。
- 工作流引擎 是能够在状态机的构造模型根底上进行构建,事实上很多开源的工作流引擎也都是基于状态机的实现形式。
理解了工作流的根本特点和应用场景之后,咱们来看一下比拟风行的开源工作流引擎。
三、开源工作流引擎
四、工作流引擎自研设计
4.1 应用开源工作流引擎的问题
- 开源工作流最大的劣势是能够借助开源的资源,开箱即用,性能全面,然而与之带来的是附带的配置和表数量比拟多的保护问题。以 Activiti 为例,应用 Activiti7.0 版本至多要引入二十多张表,尽管说看似是无侵入的形式,然而零碎演进和保护过程中有肯定的老本。特地是业务流程实例很多的时候,开发人员须要对表逻辑有更深的把控。
- 因为业务的主观独特性,作为业务流程组件,个别都须要依据本身业务进行二次开发适配。比方须要依据本身组织架构,进行流程节点用户角色权限的管控;将本身的业务能力插件化,退出工作流程配置中,进行拦挡回调等。
4.2 自研引擎外围设计思路
4.2.1 引擎外围模块
回归工作流的实质,工作流是通过预约义的流程模板,对事实流动进行实例化的过程。一个根本的工作流引擎次要包含三大外围局部:
- 流程模板创立
依据业务规定和逻辑,创立流程模板,设置每一个节点的操作和变更门路。基于模板创立,能够延长出流程设计器、插件式节点,多样化的模板文件格式、模板长久化等。
- 流程实例公布
依据流程模板,创立一个流程实例,流程模板和流程实例的关系相似类和对象的关系。比如说工单系统管理员定义好一个审批流模板(流程模板),用户点击创立一个工单(流程实例)。基于流程实例公布,又能够延长出实例实时观测,节点变迁记录回溯,实例状态长久化,失败重试,事务管制等。
- 工作流程执行
创立好流程实例之后,流程实例只须要依照流程模板的定义独立执行各自实例的工作,不同的实例之间互不影响,实现各自实例的生命周期。
4.2.2 引擎外围设计
① 利用容器启动时,加载流程引擎环境配置,包含解析器结构,流程引擎上下文,流程定义文件门路等。
② 读取定好的流程定义文件,进行流程节点解析,构建好执行上下文,将流程节点放到内存缓存中。
③ 业务侧进行流程创立,启动一个新的流程实例,同时将业务流程和流程实例进行绑定。
④ 运行流程实例各个节点,将每个流程节点进行长久化保留。
4.3 具体实际
① 引擎外围服务。
引擎操作的次要对外接口,包含启动流程实例,和获取相干流程定义模板,流程实例,流程节点的服务。
public interface FlowEngine {
/**
* 依据流程定义 key,参数列表启动流程实例
*
*/
FlowInstance startInstance(String processDefKey, Map<String, Object> args);
/**
* 依据流程定义主键 ID,参数列表执行流程工作(推动流程主动流转)* 对立事务管制
*/
void execInstance(Long instanceId, Map<String, Object> args) throws FlowAuthorityException;
/**
* 获取流程定义 process 服务
*
*/
ProcessService process();
/**
* 获取流程实例服务
*
*/
InstanceService instance();
/**
* 获取工作节点服务
*
*/
TaskService task();}
② 流程定义服务。
次要是针对流程定义模板的创立和公布,能够依据具体的实现类来反对不同的创立形式。
public interface ProcessService {
/**
* 创立流程定义模板
*
*/
void create(String definition);
/**
* 公布流程定义模板
*
*/
void deploy(String fileName);
/**
* 获取流程 key 对应的流程定义
*/
FlowProcess getProcessByDefKey(String processDefKey);
}
③ 流程实例服务。
提供流程实例创立长久化和流程实例执行的入口。
public interface InstanceService {
/**
* 创立流程实例
*
*/
FlowInstance createInstance(FlowProcess process, Map<String, Object> args);
/**
* 执行流程实例
*
* @param instanceId 流程实例 id
*/
void exec(Long instanceId);
/**
* 依据 id 获取流程实例
*
* @param instanceId
* @return
*/
FlowInstance getById(Long instanceId);
}
④ 流程工作节点服务。
提供流程节点具体每个工作的创立和查问。
public interface TaskService {
/**
* 依据任务模型、执行对象创立新的工作
*
*/
FlowTask createTask(TaskModel taskModel, Execution execution);
/**
* 实现工作
*
*/
FlowTask complete(Long taskId, Map<String, Object> args);
/**
* 获取流程实例中正在进行的工作
*
*/
FlowTask getActiveTask(Long instanceId);
/**
* 获取流程实例上一个已实现的工作
*
*/
FlowHistTask getLastDoneTask(Long instanceId);
}
其中 外围的办法 就是
FlowEngine#startInstanceByKey,启动流程实例。基于流程定义,创立一个流程实例对象。
FlowEngine#execInstance,执行流程实例工作,通过传入的上下文参数(操作人,操作变量等),依照流程定义的节点工作,推动流程实例的主动流转。
4.4 思考和扩大
- 流程定义解析性能。
因为目前设计是在利用启动时对所有的流程定义文件进行加载和解析,流程定义文件过多时会影响利用启动速度,能够通过多线程解析和懒加载(应用时解析)两种形式进行优化。
- 流程定义版本兼容性。
因为业务流程不是变化无穷的,在我的项目倒退过程中会一直进行迭代,须要对后面不同的流程进行兼容。
- 流程节点插件化和编排能力。
将根底服务进行提取专用,以反对绘制不同流程的插件化和编排能力。
- 流程执行监控能力。
对流程工作节点执行状况进行埋点上报,零碎主动进行监测告警。
五、总结
本文剖析了引入工作流引擎的背景,驱使业务逻辑从控制流中剥离进去,让产研团队更聚焦于业务,解决研发效率低的问题。
工作流的实质思维是通过预约义的工作流程模板,对事实流动进行实例化的过程。个别须要具备流程可视化、业务可编排复用、业务和管制拆散的根本能力。个别常见的工作流分为程序工作流、状态机工作流和规定驱动工作流,开源工作流框架中最常见的是状态机工作流,利用事件驱动的形式,驱使流程运行。
同时简略介绍了业界比拟风行的几种开源工作流引擎的特点,联合开源工作流引擎的特点的问题,并且针对多样化和迭代频繁的业务流程,以工作流的实质思维为出发点,咱们自研了一套轻量级的工作流引擎,分享了在实际过程中的设计思路和总结思考。