本文通过介绍携程在互联网金融服务领域如何解决业务流程合规、快速和高效落地的问题,提出了一种基于开源框架 xstate 的工作流实施和动态调整方案。这种方案适合需要在线流程升级的应用,包括金融、证券、电商、政务和物流等行业领域。
背景
用户资格在线审核是个复杂的流程,包含多个步骤与判断。这些流程,步骤和判断都必须符合一定国家的法律、规则和准则,简称合规。之前的做法是通过代码来硬编码审核流程的逻辑。当政策发生变化时,为了继续保持合规必须修改代码,测试和重新发布。这种做法的困难之处在于:
- 开发与维护难度大。对复杂逻辑做硬编码会导致对应的代码也非常复杂。通过读代码的方式来理解系统很困难,而修改老系统非常容易破坏正确逻辑或者引进新的 bug,这种系统一般没人愿意接手。
- 上线时间难以保证。新合规何时出现是无法预测的,而出现时却往往会规定较紧迫的上线时间。在开发任务非常饱满,开发进度非常紧张的时候,很难为新合规上线调整计划。据说曾经出现过新合规虽然发布并规定了上线时间,但由于各个公司实在无法按时完成开发,最终不得不推迟上线的情况。
- 无法保证系统质量。现代互联网公司往往是大规模并行开发,有固定的发布节奏,并且一次多个功能同时发布上线是常态。这种情况下,新合规功能可能会与有缺陷的功能一同上线,当缺陷版本回退的时候,会导致合规功能一起回退。这种功能间的耦合必然会影响上线效果。
由于老办法有上述这些问题,携程金服团队准备对目前的业务进行重构,考虑引入类工作流来完成业务流程。
解决方案
在金融团队评估各种方案时,我向他们推荐了 xstate,一个轻量级状态机编辑和运行框架。它是 x-series 快速开发框架中的一个组件。
xstate 包括一个基于 Eclipse 的可视化模型编辑器和一个独立的引擎。用户在 Eclipse 里用 xstate 定制的状态图编辑器构建模型文件;应用程序调用 xstate 引擎读取模型文件并在内存中创建状态机实例;运行时通过生成事件来触发实例的状态变迁,从而实现流程的推进并触发相应逻辑。
xstate 仅包含状态、变迁、事件和触发器等和状态机直接相关的最小核心概念。即可以不写一行代码实现一个可以运行的状态机,又可以用自定义的触发器灵活扩展和组织复杂逻辑。
对比其它工作流引擎,如 activiti,JBPM,虽然这几款开源软件都能完成业务需求,但 xstate 有以下几个特点:
- 无环境依赖。对数据库和环境都无特殊要求。相比其它引擎需要一系列的搭建工作,如建表、编写配置文件等,xstate 只需引入 jar 包就可直接使用。
- 快速上手。一款框架产品可以快速上手是非常重要的。xstate 是一款非常轻量级的基于状态机的框架,通过阅读文档,运行 sample 即可快速了解整个框架的运作机制,从而进行自己的开发工作,十分符合目前互联网环境快速迭代的开发节奏。
- 快速融入现有系统。xstate 提供了状态变迁所需要的所有基本步骤,使用配套的可视化工具可以快速搭建一套包含各个业务节点的工作流。通过简单配置可以迅速绑定节点和指定业务代码的关系,无需对已有的业务代码进行重构。这大大降低了二次开发的成本。
- 可视化。xstate 配套的工具包括可视化界面,能快速完成功能设计,同时如上述第三点,通过配置节点和业务代码的关系,简单的操作就串起整个业务流程。
高度集成、可视化的开发环境
xstate 的开发宗旨是要打造一个高度集成、可视化的开发环境,让用户在开发过程中无需在不同的环境中来回切换,减少工作中的停顿,从而高效工作。因此 xstate 被开发为基于 Eclipse GEF 技术的插件。Eclipse 对插件有一套完整的框架进行管理,用户只需按照标准安装步骤简单地将插件安装到 Eclipse 中,就会拥有一个与 IDE 紧密结合的工作环境。
具体安装步骤可以参考安装指南:
https://github.com/hejiehui/xross-tools-installer#安装步骤
由于 xstate 的开发主要用到 Eclipse 的 GEF 技术。为了方便大家理解,这里简要的介绍一下 GEF。GEF(Graphical Editing Framework)是一个图形化编辑框架,它允许开发人员以图形化的方式展示和编辑模型,从而提升用户体验。
GEF 最早是 Eclipse 的一个内部项目,后来逐渐转变为 Eclipse 的一个开源工具项目,Eclipse 的不少其它子项目都需要它的支持。有很多应用天然适合图形化展示,包括 UML 类图编辑器、图形化 XML 编辑器、界面设计工具以及图形化数据库结构设计工具等等。
GEF 的优势是提供了标准的 MVC(Model-View-Control)结构,开发人员可以利用 GEF 来完成以上这些功能,而不需要自己重新设计。与其他一些 MVC 编辑框架相比,GEF 的一个主要设计目标是尽量减少模型和视图之间的依赖,好处是可以根据需要选择任意模型和视图的组合,而不必受开发框架的局限。
GEF 模型只与控制器打交道,而不知道任何与视图有关的东西。为了能让控制器知道模型的变化,应该把控制器作为事件监听者注册在模型中,当模型发生变化时,就触发相应的事件给控制器,后者负责通知各个视图进行更新。
GEF 控制器是模型与视图之间的桥梁,也是整个 GEF 的核心。它不仅要监听模型的变化,当用户编辑视图时,还要把编辑结果反映到模型上。举个例子来说,用户在数据库结构图上删除一个表时,控制器应该从模型中删除这个表对象、表中的字段对象、以及与这些对象有关的所有连接。
在这个案例中,用户可以利用 xstate 对审核流程建模,并用 xstate 在线上实际运行流程处理和逻辑判断。在进一步沟通了解之后,携程金融团队认为该框架符合他们的各项要求,并在现有系统改造和新合规发布中加以采用。
效果
采用 xstate 后,当新合规下发时,大部分情况下,开发人员只需在 IDE 里面打开已有 xstate 模型文件,在交互式的图形编辑器里面以所见即所得的方式修改状态机即可完成开发。测试人员可以通过状态机的可视化模型进行直观的理解和验证测试。
测试通过后,模型可以单独发布到携程的配置中心,无需应用重新发布或重启。应用在监听到变更请求时,通知 xstate 引擎读取新的模型数据并创建模型,即可实现合规的在线发布或升级。
使用 xstate 后,合规的开发与维护做到了简单高效,发布做到了灵活即时,最终的实际效果让人满意。
下图是一个业务功能重构中,流程图在 xstate 中的显示效果:
同时 xstate 还吸收了用户在使用过程中提出的改进意见,促进了框架的进一步完善,取得了双赢的效果。
作者简介
赫杰辉,开源框架 x-series 作者,携程 dal 框架贡献者,认为传统开发模式已经无法适应新的时代,相信开发工具是提高效率和质量的关键因素。业余时间喜欢玩躺车,单鳍脚蹼等古怪玩意。
怀立德,从事金融行业技术 10 年,对能让设计、开发工作变得更轻松的技术都有兴趣。毕生最大的目标就是如何让程序猿变得更懒,如今随着体重的逐渐上升,已略有小成。
感谢雨多田光对本文的审校。
评论