优雅实现多系统一致性补偿方案(上)
280
类别: 
开发交流
  • 前言
  • 案例说明
  • 解决思路
  • 优化

前言

我们在开发的过程中,如果一个业务操作需要本地写MYSQL数据以及对第三方系统做写操作,那么这种流程就涉及到分布式系统一致性的问题,然而并非所有系统都能使用成熟的分布式事务方案

案例说明

以一个财务报账业务为例,涉及到的系统如下:

image.png
详细解释下各系统作用:

  • 单据系统: 财务报账,会提交很多信息(例如:报账事由、报账金额与明细)。同时也会生成财务凭证(不了解凭证也没关系,它就是给财务人员看的东西,对技术人员来说就是数据库的一堆数据)
  • BPM系统: 非常成熟的流程管理系统,以非常直观的方式来实现流程的搭配,不了解的可以自行百度扫盲。在此案例中,需要使用BPM的两个能力:1)调用API,审核通过 2)调用API,获取流程的待审人
  • SAP系统: 财务专用系统,不用过多了解,只要知道在财务审核完成后,会将单据系统生成的凭证数据通过API调用的方式发送给SAP即可

“审核通过”业务流程

当审核人员审核通过时,大致流程如下:

  • 保存业务数据+记录审核日志
  • 调用BPM接口,审核通过
  • 调用BPM接口,获取最新待审人
  • 如果没有待审人,说明已经审完,生成凭证并推送SAP

代码如下

image.png

风险分析

image.png
如图所示,如果在1和2出现异常,由于有事务的存在,操作1内的几条mysql写操作会被回滚,因此所有数据都没有任何变化。

但如果1和2正常执行,操作3发生异常,操作1的数据会因为事务回滚,但操作2并不能。因此整个系统会出现一个很诡异的现象:单据系统内,没有任何日志记录,用户操作的数据也没有保留下来,但BPM那边却已经审核通过了,这在任何正常流程中,都是不可能出现的状态。

对于用户而言,他在页面会收到报错,然后可能会再次点击“审核通过”,而此时BPM那边却显示,流程已经走到下一个节点,该用户无权限操作。

问题分析

根本原因其实不难,因为MYSQL事务只能管他自己,没法控制第三方系统

标签:
评论 0
/ 1000
0
0
收藏