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模式,只是在第一种场景下,整个业务链只要用户余额和限量礼物余额足够就可以完成这个业务核心,如果够发消息事件通知下游业务处理。如果不够,则不会触发下游业务,也不存在补偿。
相关文章
|
5天前
|
JSON Java API
利用Spring Cloud Gateway Predicate优化微服务路由策略
Spring Cloud Gateway 的路由配置中,`predicates`​(断言)用于定义哪些请求应该匹配特定的路由规则。 断言是Gateway在进行路由时,根据具体的请求信息如请求路径、请求方法、请求参数等进行匹配的规则。当一个请求的信息符合断言设置的条件时,Gateway就会将该请求路由到对应的服务上。
103 69
利用Spring Cloud Gateway Predicate优化微服务路由策略
|
2月前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
75 2
|
1天前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
24 13
|
22天前
|
Java Nacos Sentinel
Spring Cloud Alibaba:一站式微服务解决方案
Spring Cloud Alibaba(简称SCA) 是一个基于 Spring Cloud 构建的开源微服务框架,专为解决分布式系统中的服务治理、配置管理、服务发现、消息总线等问题而设计。
184 13
Spring Cloud Alibaba:一站式微服务解决方案
|
27天前
|
缓存 安全 Java
Spring高手之路26——全方位掌握事务监听器
本文深入探讨了Spring事务监听器的设计与实现,包括通过TransactionSynchronization接口和@TransactionalEventListener注解实现事务监听器的方法,并通过实例详细展示了如何在事务生命周期的不同阶段执行自定义逻辑,提供了实际应用场景中的最佳实践。
43 2
Spring高手之路26——全方位掌握事务监听器
|
29天前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。
|
29天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
90 5
|
29天前
|
Prometheus 监控 Java
如何全面监控所有的 Spring Boot 微服务
如何全面监控所有的 Spring Boot 微服务
53 3
|
1月前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
56 1
Spring高手之路24——事务类型及传播行为实战指南
|
1月前
|
JavaScript Java 关系型数据库
Spring事务失效的8种场景
本文总结了使用 @Transactional 注解时事务可能失效的几种情况,包括数据库引擎不支持事务、类未被 Spring 管理、方法非 public、自身调用、未配置事务管理器、设置为不支持事务、异常未抛出及异常类型不匹配等。针对这些情况,文章提供了相应的解决建议,帮助开发者排查和解决事务不生效的问题。