记一次项目中跨系统的日志补偿实现事物一致性

      所在项目是一种以Activity流程引擎为业务支撑技术,即通过走流程的方式完成对业务数据的评估、会签、审批、发布,当然实际节点不止这几个以及可以进行反向走流程、子流程等一系列的业务诉求,在拆解为微服务之前,

这是一个很庞大的单体项目,介于各种原因拆解为多个微服务,各个微服务之间的数据、操作依赖使用接口调用完成业务诉求,还拆分出了一个公共组,用于维护公共数据、实现公共功能,其中启动流程相关的就是在公共组,因为各个

模块(微服务)都有用工作流,所以没必要每个子系统都写一套,更没必要都有一套存储流程数据的表。除此之外,原系统中对于不同的登录人有不同的角色,对应的权限不一样比如系统管理员、业务管理员、超级用户以及专门使用系统

的人----CEG,系统的大多数业务都有此角色操作,所以还有一个CEG一站式,是一个专门为了这个角色创建的子系统,以此满足此角色权限下的各种业务操作诉求,毕竟拆分子系统之后不能让一个CEG角色去多个子系统操作,为了保证

流程代办的统一入口(每个系统发代办时,代办系统会把该代办挂在发送该代办的应用下面),由一站式提供发送、删除代办的入口服务,各个子系统在启动流程、完成当前节点时需要调取一站式服务发送下个节点的代办,还要删除当前节点

的代办,这时就出现了跨系统的事务一致性问题了。

      启动流程、完成节点的服务由公共组提供,发代办、删代办由一站式提供,在做完上面两件事之后,还要改变自己系统的表里记录的流程状态、业务数据状态使之与公共组那边存的真正的流程状态一致。上面三个操作必须要么一致性成功,

要么都失败。在设计方案时,经过实际情况分析,决定了由完成节点服务为主体,其他两个操作由完成节点的成功与失败决定做与不做,并使用日志补偿的方式完成对代办的发送与删除。所以在各个节点调取公共组完成当前节点

之后,如果这次调取失败,则返回数据通知前台,如果是成功的,则调取一站式服务先发送下一个节点的代办,再调取一次服务删除当前节点的代办,如果发送或者删除失败,则启动异步,更新表流程、业务数据状态,在异步里循环再调取发送或者删除代办的服务,最多3次。超过3次依旧没有发送或者删除超过,则把该日志记录到表里,该表有两个关键字段:有效标识、调用次数,在插入该表时默认有效即标识为Y,次数为0。开启定时任务,每天3次从该表获取的数据,如果某笔数据有效标识为Y且次数大于5,则发送消息或者邮箱通知IT人员(多次调取发送或者删除服务都未成功则可能不是服务的问题而是数据本身即入参有问题,所以需要IT人员介入处理),有效标识为Y但次数没有大于5的则再次调取服务,调取成功则更改标识,否则次数加1。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值