作者|vivo互联网服务器团队-程旺荣本文分析了工作流技术在营销自动化业务中引入的背景和工作流引擎的引入,介绍了几种流行的行业特点开源的工作流引擎,以及项目自研过程中的设计思路和总结思路。1.业务背景营销自动化平台可支持针对不同用户生命周期配置活动旅程策略,根据用户触发的不同活动行为实施差异化的营销触达方案。同时,在各类活动的具体执行过程中,存在着不同的业务处理流程(如审批流程、业务流程等)。业务流程复杂多样,需求变化频繁。项目开发过程中会出现以下痛点:项目交付周期长:一个完整??的业务流程需要根据版本从头开始迭代,导致开发时间长,成本高。功能重复开发测试:业务之间会有很多共同的流程,导致大量的重复开发测试工作,效率低下。维护成本高:随着项目业务的逐渐发展,业务流程逐渐积累,可维护性下降,系统变更牵一发而动全身。如何将业务逻辑与控制流分离,让产研人员更专注于业务的实现,是需要解决的问题。传统的OA领域使用的是经过验证的业务流程管理解决方案——Workflow。工作流是一套工业级解决方案,由工作流管理联盟(WfMC)制定的一系列标准。2.工作流介绍2.1工作流定义工作流(Workflow)——将工作流及其运行步骤之间的业务规则抽象出来,对过程中的工作组织逻辑和规则进行建模,交给计算机自动处理。工作流的本质思想是:通过预定义的工作流模板实例化真实活动的过程。简单来说,就是通过预设的格式或者可视化来配置流程的模板(比如分享活动的运行流程模板)。使用时,通过模板构造一个流程实例对象,通过实例对象完成活动运行跟踪和回溯。2.2工作流参考模型WfMC工作流管理联盟制定了工作流参考模型,其核心是中间工作流引擎,提供流程定义工具(界面一),为用户提供信息查询(界面二),调用能力外部应用程序(接口3),集成其他工作流(接口4)和监控管理(接口5)。对于大多数工作流产品来说,重点是接口1和接口2的实现。2.3工作流引擎的主要特点流程可视化提供可视化流程构建、流程视图查看能力、实时观察任务执行能力。业务可编排复用,将公共服务组件化,支持任务自由编排,自由构建适合业务的不同流程。业务与控制分离,将流程控制(如流、判断、循环、重试等)任务交给工作流,让用户专注于核心业务逻辑。2.4工作流引擎的类型工作流的类型没有专门的标准。根据流程任务节点的特点,可以分为:顺序工作流。顺序工作流的运行方式类似于一个特定的流程图。上一个流程任务完成后,会进入下一个流程任务,流程不可逆。状态机工作流状态机工作流关注的是流程任务的状态。驱动任务状态变化的因素一般是外部事件,即驱动任务节点从一种状态运行到另一种状态的事件驱动方法。节点是可逆的。规则驱动的工作流关注节点的运行规则,根据业务规则执行工作流。规则驱动的工作流在处理目标明确但“规则”或规范级别不同的各种项目时非常有用。可以看出,不同类型的工作流并不是完全分离的,状态机工作流还可以结合条件和规则来执行操作节点转换的过程。在软件开发中,通常考虑状态机和规则驱动工作流的结合。2.5工作流引擎和状态机的区别在上一篇文章中,我们对状态机和工作流引擎进行了简单的比较。事实上,这两者并不是完全等价的概念:状态机是系统状态和这些状态之间的转换、动作等行为的数学计算模型,而工作流是整体工作流及其之间的业务逻辑和规则的抽象建模。各种操作步骤。状态机模式是事件驱动的,状态的自动流动大部分是由外部事件触发的;工作流引擎更侧重于描述完成预定义流程任务后的自动流程,可预测性会更强。从适用场景的复杂度来看,直接使用状态机可以清晰的描述所有可能导致转化的状态和事件,适用于解决单一维度、低复杂度的业务问题,发挥特性灵活轻便;工作流引擎更适用于复杂的业务流程管理,解决更复杂的流程自动化问题,如大型CRM,专注于提高整体业务流程的效率。工作流引擎可以建立在状态机结构模型的基础上。事实上,很多开源的工作流引擎也是基于状态机实现的。了解了工作流的基本特性和使用场景后,我们再来看看比较流行的开源工作流引擎。3.开源工作流引擎4.工作流引擎自研设计4.1使用开源工作流引擎的问题开源工作流最大的优势在于借助开源资源开箱即用,功能全面,但是随之带来的是大量附带配置和表的维护问题。以Activiti为例,使用Activiti7.0版本至少需要20张表。虽然看起来是一种非侵入式的方式,但是在系统演进和维护的过程中是有一定成本的。尤其是当业务流程实例较多时,开发者需要对表逻辑有更深层次的控制。由于业务的客观性和独特性,作为业务流程组件,一般需要根据自身业务进行二次开发和适配。例如,需要根据自身的组织架构,对流程节点的用户角色权限进行管控;插件自己的业务能力,添加到工作流配置中,进行拦截回调。4.2自研引擎核心设计思路4.2.1引擎核心模块回归工作流本质。工作流是通过预定义的过程模板实例化真实活动的过程。一个基本的工作流引擎主要包括三个核心部分:流程模板创建根据业务规则和逻辑创建流程模板,并设置每个节点的操作和变化路径。基于模板创建,可以扩展流程设计器、插件节点、多样的模板文件格式、模板持久化等。流程实例发布基于流程模板创建流程实例,流程模板与流程实例的关系类似于类与对象的关系。例如,工单系统管理员定义一个审批流模板(流程模板),用户点击创建一个工单(流程实例)。基于流程实例发布,可以扩展实时实例观察、节点迁移记录回溯、实例状态持久化、失败重试、事务控制等。任务流程执行流程实例创建后,流程实例只需要根据流程模板的定义,独立执行自己实例的任务即可。不同实例之间互不影响,完成每个实例的生命周期。4.2.2引擎核心设计①应用容器启动时,加载流程引擎环境配置,包括解析器结构、流程引擎上下文、流程定义文件路径等。②读取定义好的流程定义文件,分析流程节点,构建执行上下文,并将进程节点放入内存缓存中。③在业务端创建流程,启动新的流程实例,同时绑定业务流程和流程实例。④运行流程实例的各个节点,并持久保存各个流程节点。4.3具体做法①引擎核心服务。引擎操作的主要对外接口,包括启动流程实例,获取相关的流程定义模板、流程实例、流程节点服务。publicinterfaceFlowEngine{/***根据流程定义key,参数列表启动流程实例**/FlowInstancestartInstance(StringprocessDefKey,Map
