小编推荐
在企业数字化转型的征途中,跨系统的数据流转常常是棘手的难题。央企巨头如何破解跨库事务的难题,确保业务流程的顺畅和数据的一致性?答案就藏在本期实践案例中。
跟随小编步伐,一起探索如何巧用操作参数和状态机,打造个性化的事件订阅,让业务流转不再有障碍~
业务背景
某大型央企,是一家以金属、矿产品的开发、生产、贸易和综合服务为主,同时兼营金融、房地产、物流业务的大型国际化企业集团。在业财一体化的背景下,不同模块间需要互相传递数据。
客户业务系统、财务系统、主数据系统等多个系统都是以苍穹为基座,按不同业务场景划分模块,进行分库分表。这就导致不同模块间的协同会出现跨库事务、跨库写入的问题。
客户希望能够提供高效的方案来解决下述痛点和诉求:
1、 跨模块调用操作要保证事务一致性。
2、 财务调用操作后,需要调用业务端操作,将财务端金额等字段反写到业务单据。但是由于财务单据与业务单据存放在不同的库,同一事务里跨库写入会报错。
3、 对特殊的业务场景,要求保证操作幂等性。
业务流程图
解决方案
1. 整体思路
通过业务事件中心,以事件驱动的方式,打破业务壁垒,串联财务端到业务端的流程。同时利用事件订阅自带的异步特性,解决同一事务不能跨库写入的问题。使用状态机,描述单据从初始状态开始,响应不同事件并执行对应动作,从而引起状态转换,直到单据变为终结状态。具体而言:
先将不同模块的操作抽象为不同【事件】,然后按照执行顺序排列,为每个【事件】设计触发状态和响应状态。下游操作订阅上游操作,同时设置事件订阅操作参数,传递上游操作的响应状态到下游,在进行下一步操作前,先校验上级操作的响应状态是否等于下游操作的触发状态,从而保证整体流程事务一致性和下游业务操作幂等性。整体流程如下:
【初始状态】->【财务端A操作】->(校验操作A状态)->【业务端B操作】->(校验操作B状态)->【财务端C操作】->(校验操作C状态)->【最终状态】
注:状态机是一种数学模型,用于描述系统或程序在不同状态之间转换的行为。它由一组状态、转移条件和动作组成。
状态机常用于处理事件驱动的编程模型,当系统接收到不同的事件时,状态机可以根据当前状态和事件类型执行相应的操作和状态转换。
2. 关键步骤及效果展示
• 【流程服务云】→【业务事件中心】→【事件定义】 →【新增】创建三个事件定义,并打开【传递操作参数】开关。
• 在操作中绑定插件,将要传递的操作参数设置好,采取设置操作变量的方式,将要传递的key和value随事件的触发传递给业务事件中心:this.operateOption.setVariableValue("key", "value");
上游操作插件代码示例如下,用于把上游操作执行后的状态传递给下游:
• 按照实际业务将不同业务排序,下游操作订阅上游操作,并填写【操作参数配置】,设置操作参数为【上游操作】。
• 下游操作获取操作参数,并校验状态。如果状态通过校验,则执行下游操作。否则,直接返回。
下游操作的插件代码示例如下,用来取上游传递下来的状态:
方案的可推广价值
1. 利用事件订阅异步执行的特性,可解决跨库写入报错的业务场景。
2. 通过传递操作参数,在执行下游操作前进行状态校验。保证异步操作事务一致性和下游操作幂等性。
3. 可根据实际业务具体的需求,灵活组装各个模块的操作,从而实现不同的业务流程。在助力系统保持弹性的同时,快速适应变化,以应对未来业务的不确定性。
注意事项
1、事件订阅有失败重试策略,对于有幂等性要求的操作,要注意选择正确的【错误处理策略】。
相关资料
https://vip.kingdee.com/knowledge/specialDetail/282527627108140288?category=283974464923236608&id=549892035956494080&productLineId=29&lang=zh-CN
#往期推荐#