简介
本文通过介绍携程在互联网金融服务领域如何快速高效解决合规落地问题,提出了一种基于 xstate 的工作流动态调整方案。这种方案适合所有需要在线流程升级的应用。包括金融,证券,电商,政务,物流等行业领域。
方案背景
随着互联网金融的日益壮大,传统银行与互联网公司合作寻求共赢成为一种常见的模式。携程作为在线旅游的领导者也主动顺应这一潮流,积极开拓了金融服务领域的业务。在具体应用中,某场景需要对用户资格进行在线审核。熟悉金融相关业务的开发人员应该知道,在线审核一般包含多个步骤与判断,是个比较复杂的流程。这些流程,步骤和判断都需要与一定国家的法律、规则和准则相一致,简称合规。当政策发生变化,系统也会必然随之调整以做到继续保持合规。传统的做法一般是通过代码来实现审核流程,升级的办法主要是修改代码,测试和重新发布。这种做法在携程这种量级的系统里无疑是极具挑战性的,具体表现在以下几个方面:
- 开发与维护难度大。传统的开发方式是用代码来实现合规,在合规逻辑本身比较复杂,条件判断复杂的情况下,通过读代码的方式来理解和修改系统非常低效。复杂代码往往非常难以理解和维护,修改老系统非常容易破坏正确逻辑或者引进新的 bug,导致开发质量低下。
- 上线时间难以保证。新合规的出现是无法预测的,而某些新合规往往会规定较紧迫的上线时间。在开发工作安排的非常饱满,开发进度非常紧张的时候,为新合规上线划拨资源,安排进度从项目管理角度是上线很困难的事情。甚至曾经出现过虽然国家发布了新合规和规定了上线时间,但由于各个公司实在无法按时上线,最终国家不得不推迟上线时限的情况。
- 无法保证系统质量。现代互联网公司往往是大规模并行开发,有固定的发布节奏,并且一次发布多个功能同时上线是常态。这种情况下,新合规功能可能会与有缺陷的功能一同上线,当缺陷版本回退的时候,会导致合规功能一起回退,从而影响新合规的实际上线时间节点和效果。
简而言之,携程金服团队希望合规开发能降低成本,缩短周期;合规维护能做到快速理解,修改和验证现有系统;合规发布能精准,高效,影响面小,不可控干扰因素少;合格回退能独立实时,副作用小。理想情况下,最好能够做到不停机发布。
解决方案
金融团队的技术 leader 在评估各种方案时,也向携程框架部门寻求了技术支持。根据他们的需求,我向他们推荐了 xstate。
xstate 是一个基于状态机模型的开源框架,利用与 IDE 紧密结合的模型编辑器,用户可以用可视化的方式直观地开发模型。xstate 编辑器的功能非常完备,可以灵活地构建任意的复杂模型,模型存储格式为 XML。xstate 引擎对运行环境无特殊要求,可以内嵌到任意容器或单独运行。为了适应各种使用场景,xstate 引擎提供了灵活多样的模型数据读取方式,包括读取 file,url,classpath 甚至 stream 等。
相对于类似框架,xstate 的优点在于:
- 二次开发工作量小。Xstate 的开发非常轻量级,即可以在不写一行代码的情况下实现一个功能完备的状态机,必要时也可以利用定义良好的接口实现灵活扩展。
- 概念简洁完备。Xstate 仅仅包含状态机,状态,变迁,事件等最少核心概念。而很多类似产品的模型过于复杂,包括很多与核心模型无关的辅助模型。例如 role,人员,组等。往往要完成繁琐配置才能真正用起来。
- 开发环境友好。Xstate 的编辑器紧密结合在用户熟悉的主流开发环境里。用户无需离开当前开发环境,无需在多个不同的编辑器中切换。类似产品往往是与 IDE 无关的独立的编辑器。
- 使用方便。Xstate 的产出只是模型文件。而且提供多种灵活的读取方式。类似产品往往依赖数据库,环境部署复杂。
在进一步沟通了解之后,携程金融团队认为该框架符合他们的各项要求,并在现有系统改造和新合规发布中加以采用。
使用效果
采用 xstate 后,当新合规下发时,开发人员一般只需在 IDE 里面打开已有 xstate 模型文件,在交互式的图形编辑器里面以所见即所得的方式修改状态机即可完成开发。测试人员可以通过状态机的可视化模型进行直观的理解和验证测试。测试通过后,模型可以单独发布到携程的配置中心,无需应用重新发布或重启。应用在监听到变更请求的时,通知 xstate 引擎读取新的模型数据并创建模型,即可实现合规的在线发布或升级。
使用 xstate 后,合规的开发与维护做到了简单高效,发布做到了灵活即时,最终的实际效果让用户很满意。同时 xstate 还吸收了用户在使用过程中提出的改进意见,促进了框架的进一步完善。合作做到了双赢。
Xstate 使用心得
最近需要对目前的业务进行重构,考虑引入类工作流来完成业务流程。对比了好几款工作流引擎,如 activiti,JBPM 等,最后选择了 Xstate 来作为重构业务流程方案。
对比的几款开源软件都能完成我的业务需求,最终选择 Xstate 理由有以下几点:
- 无环境依赖。对数据库,环境都无特殊要求。相比其余的引擎需要一系列的搭建工作,如建表,编写配置文件等,Xstate 只需引入 jar 包就可直接使用。
- 快速上手。一款框架产品可以快速上手是非常重要的。Xstate 是一款非常轻量级的基于状态机的框架,通过阅读文档,运行 sample 即可快速了解整个框架的运作机制,从而进行自己的开发工作。十分符合目前互联网环境快速迭代的开发节奏。
- 快速融入现有系统。Xstate 提供了状态扭转所需要的所有基本步骤,使用配套的可视化工具可以快速搭建一套包含各个业务节点的工作流。通过简单配置可以迅速绑定节点和指定业务代码的关系,无需对已有的业务代码进行重构。这大大降低了二次开发的成本。
- 可视化工具。Xstate 配套有 Xtools 工具,通过可视化界面,快速完成功能设计,同时如上述第三点,通过配置节点和业务代码的关系,简单的操作就串起整个业务流程。
总结
Xstate 是一款可以快速上手的基于状态机的框架。很适合使用在各个有多个状态流转的业务场景中,满足多状态节点的互相流转。
目前我重构的业务功能已经完成,流程如下图。
作者简介
赫杰辉(携程框架架构师),后台系统研发老油条,专注于开发效率提升、设计哲学总结。开源框架 x-series 作者,携程 dal 框架贡献者,太极爱好者,喜欢玩躺车等古怪玩意。
怀立德(携程金融架构师怀立德),从事金融行业技术 10 年了,对能让设计,开发工作变得更轻松的技术都有兴趣。毕生最大的目标就是如何让程序猿变得更懒,如今随着体重的逐渐上升,已略有小成。
参考资料
xstate 是开源框架集 x-series 中的一个独立组件,其他组件还包括流程图 xunit,决策树 xdecision。这些框架的使用方式都是基于可视化方式编辑模型
开源网址:www.xrosstools.com