最近完成一个项目,使用springboot微服务架构。不免遇到分布式事务的难题。业务情况是:用户可以使用积分和返利来支付订单,在订单创建的事件中,需要占用积分账户和返利账户,然后消费积分,消费返利,最后完成订单创建。实际开发中,积分和返利都是另外第三方的系统,不可能提供给我们许多接口,因此,分布式事务最后采用了可靠性事件模式。总体上保证数据一致性。
本地事件表
-
微服务在同一个本地事务中记录业务数据和事件。
-
微服务实时发布一个事件立即通知关联的业务服务,如果事件发布成功立即更新记录的事件状态。
- 事件恢复服务定时从事件表中恢复未发布成功的事件,重新发布,重新发布成功才更新记录的事件状态。
补偿模式
补偿模式是更复杂的业务处理逻辑,可以允许有逆操作的业务可以使用该模式。
(微服务实现补偿操作不是简单的回退到业务发生时的状态,因为可能还有其他的并发的请求同时更改了状态。一般都使用逆操作的方式完成补偿。)补偿模式使用一个额外的协调服务来协调各个需要保证一致性的微服务,协调服务按顺序调用各个微服务,如果某个微服务调用异常(包括业务异常和技术异常)就取消之前所有已经调用成功的微服务。
TCC模式和补偿模式一样需要需要有协调服务和工作服务,协调服务也可以作为通用服务一般实现为框架。与补偿模式不同的是 TCC 服务框架不需要记录详细的业务流水,完成 confirm 和 cancel 操作的业务要素由业务服务提供。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/191871.html