spring-cloud 关于微服务群下事务一致性的小结

本文涉及的产品
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介:
一、保证事务一致性的3种模式:
1.可靠事件模式:
a.适合场景:微服务A完成某个业务时,需要触发微服务B、微服务C、微服务D、微服务E...。因为链路比较长,直接调用各个服务的接口时,如果当中某个服D务因为一些原因,没有收到调用会导致整个要完成的业务受到影响。如果这个服务D是个不需要回应服务A的,且不对后续其他服务执行产生影响的变更数据服务。那么可以将这个服务的调用改为由服务A发送消息事件到消息中心,服务D通过消费消息中心里对应的消息,完成自己的业务。这样可以避免因为服务D的异常,导致回滚整个链路里其他服务的所有数据。
b.实际用例:直播平台里用户给主播送一种系统限量礼物,送完后需要同步在统计中心服务记录这条数据。这中间需要触发的服务暂定为:用户中心(用于判断余额是否足够赠送指定礼物)、礼物中心(用于决定礼物仓库库存是否足够本次业务赠送)、主播中心(用于主播类型用户的升级业务集合,负责接受此次的礼物赠送)、统计中心(用于记录本次赠送礼物的动作)。
那么,可以发现在这个业务链路中,只要用户的余额和限量礼物库存足够,就可以完成这次赠送。主播中心和统计中心的业务处理,不需要回应这次礼物赠送业务。但是,如果主播中心和统计中心不能完成自己的业务,又会导致主播的损失,并且对系统统计数据分析造成影响。
因为上述情况,所以可以将主播中心和统计中心的业务触发,改为在用户中心和礼物中心符合赠送条件后,直接向消息中心发送一个赠送礼物事件消息。后续主播中心和统计中心,通过约定的消息条件获取需要处理的消息并进行消费。

2.业务补偿模式(略过,TCC模式重叠比较大):

3.TCC模式:
a.适合场景:TCC模式是try、comfirm、cancel三个操作的简写。同样微服务A完成某个业务时,需要触发微服务B、微服务C、微服务D、微服务E...。不同的是在这个业务链路中,如果整个链路不能正常完成,微服务D需要回滚数据到业务未进行的状态。此时,在链路中直接去控制微服务D回滚是一个比较麻烦的事情,而且也破坏了微服务之间解耦的初衷。那么最好的处理方式便是调整微服务D在这个业务中提供的处理接口,将原本的可能一个接口处理微服务D关联的所有业务,进行分割。分割原则便是TCC,在try接口里负责尝试拿到完成微服务A这个业务需要的资源,并记录这个资源消耗信息。在comfirm接口里则负责处理原本微服务D资源消耗成功的情况下,微服务D本身需要处理的关联业务。在cancel接口里则负责处理将try接口消耗的资源补偿回去。这样下,即便业务链路没有全部完成,针对微服务D的补偿操作,也更容易执行。此处,try接口调用异常(响应网络状态不对,如微服务D的网络抖动不可用)时,可以和重试机制处理配合。在comfirm和cancel阶段,响应状态不对时(微服务D的网络间歇不可用)则可以考虑和发送事件消息结合。
b.实际用例:还是上面的例子,直播平台里用户给主播送一种系统限量礼物。但是在调用用户中心里判断用户余额足够赠送并且将用户余额相应扣除后,调用礼物中心却发现限量礼物库存不够,这时候就需要将用户中心里刚扣除的余额数据补偿回去。
因为上述情况,所以可以将用户中心里的用户余额操作按TCC原则进行分割。链路触发时调用用户中心余额操作的try接口,在try接口里只做扣除相应余额并记录扣除的操作信息(操作Id,数值等),不处理关联的用户账单变化及其他可能的关联业务。在comfirm接口里则处理,整个链路如果都可以完成时,用户中心关联的其他业务处理。在cancel接口里则负责将try接口里扣除的余额补偿回去。
这样,整个链路开始时调用用户中心提供的try接口,尝试扣除资源,发现足够。再调用礼物中心try接口,发现不够时,礼物中心直接返回不够的信息。接到礼物中心的反馈后,就可以调用用户中心的cancel接口进行补偿操作。礼物中心反馈足够时,则调用用户中心的comfirm接口处理关联业务。然后调用礼物中心的comfirm接口,同样处理礼物中心关联的业务。

备注:外服务接口是否取用TCC模式,主要还是在于该接口业务实际情况。如果微服务提供的接口业务有更新数据的操作,且需要在外部关联业务出现异常时回滚之前的数据更新,那么开启TCC模式比较好。像上面的主播中心实际上也可以改成TCC模式,只是在第一种场景下,整个业务链只要用户余额和限量礼物余额足够就可以完成这个业务核心,如果够发消息事件通知下游业务处理。如果不够,则不会触发下游业务,也不存在补偿。
相关文章
|
2天前
|
消息中间件 Java 开发者
【颠覆想象】Spring Boot重构未来:解耦与隔离,打造坚不可摧的微服务帝国!
【8月更文挑战第29天】本文通过构建电子商务平台的具体案例,深入探讨了如何利用 Spring Boot 实现服务间的解耦与隔离。文章详细介绍了依赖注入、模块化设计及异步通信等关键技术,并提供了具体代码示例。通过依赖注入,对象间耦合得以降低;模块化设计使各功能域独立,降低系统复杂度;异步通信则利用消息队列提升系统吞吐量与响应速度。这些方法不仅优化了系统架构,还加快了开发进程。
14 0
|
2天前
|
Java UED Sentinel
微服务守护神:Spring Cloud Sentinel,让你的系统在流量洪峰中稳如磐石!
【8月更文挑战第29天】Spring Cloud Sentinel结合了阿里巴巴Sentinel的流控、降级、熔断和热点规则等特性,为微服务架构下的应用提供了一套完整的流量控制解决方案。它能够有效应对突发流量,保护服务稳定性,避免雪崩效应,确保系统在高并发下健康运行。通过简单的配置和注解即可实现高效流量控制,适用于高并发场景、依赖服务不稳定及资源保护等多种情况,显著提升系统健壮性和用户体验。
12 1
|
17天前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2天前
|
Cloud Native Java Nacos
微服务时代的新宠儿!Spring Cloud Nacos实战指南,带你玩转服务发现与配置管理,拥抱云原生潮流!
【8月更文挑战第29天】Spring Cloud Nacos作为微服务架构中的新兴之星,凭借其轻量、高效的特点,迅速成为服务发现、配置管理和治理的首选方案。Nacos(命名和配置服务)由阿里巴巴开源,为云原生应用提供了动态服务发现及配置管理等功能,简化了服务间的调用与依赖管理。本文将指导你通过五个步骤在Spring Boot项目中集成Nacos,实现服务注册、发现及配置动态管理,从而轻松搭建出高效的微服务环境。
14 0
|
2天前
|
Dubbo Java 应用服务中间件
💥Spring Cloud Dubbo火爆来袭!微服务通信的终极利器,你知道它有多强大吗?🔥
【8月更文挑战第29天】随着信息技术的发展,微服务架构成为企业应用开发的主流模式,而高效的微服务通信至关重要。Spring Cloud Dubbo通过整合Dubbo与Spring Cloud的优势,提供高性能RPC通信及丰富的生态支持,包括服务注册与发现、负载均衡和容错机制等,简化了服务调用管理并支持多种通信协议,提升了系统的可伸缩性和稳定性,成为微服务通信领域的优选方案。开发者仅需关注业务逻辑,而无需过多关心底层通信细节,使得Spring Cloud Dubbo在未来微服务开发中将更加受到青睐。
|
18天前
|
Java 程序员 数据库连接
女朋友不懂Spring事务原理,今天给她讲清楚了!
该文章讲述了如何解释Spring事务管理的基本原理,特别是针对女朋友在面试中遇到的问题。文章首先通过一个简单的例子引入了传统事务处理的方式,然后详细讨论了Spring事务管理的实现机制。
女朋友不懂Spring事务原理,今天给她讲清楚了!
|
12天前
|
Java 微服务 Spring
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
文章介绍了如何利用Spring Cloud Alibaba快速构建大型电商系统的分布式微服务,包括服务限流降级等主要功能的实现,并通过注解和配置简化了Spring Cloud应用的接入和搭建过程。
SpringBoot+Vue+Spring Cloud Alibaba 实现大型电商系统【分布式微服务实现】
|
15天前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
17天前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
下一篇
云函数