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模式,只是在第一种场景下,整个业务链只要用户余额和限量礼物余额足够就可以完成这个业务核心,如果够发消息事件通知下游业务处理。如果不够,则不会触发下游业务,也不存在补偿。
相关文章
|
27天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
49 2
|
2月前
|
Java 对象存储 开发者
解析Spring Cloud与Netflix OSS:微服务架构中的左右手如何协同作战
Spring Cloud与Netflix OSS不仅是现代微服务架构中不可或缺的一部分,它们还通过不断的技术创新和社区贡献推动了整个行业的发展。无论是对于初创企业还是大型组织来说,掌握并合理运用这两套工具,都能极大地提升软件系统的灵活性、可扩展性以及整体性能。随着云计算和容器化技术的进一步普及,Spring Cloud与Netflix OSS将继续引领微服务技术的发展潮流。
52 0
|
11天前
|
Java 开发者 Spring
Spring高手之路24——事务类型及传播行为实战指南
本篇文章深入探讨了Spring中的事务管理,特别是事务传播行为(如REQUIRES_NEW和NESTED)的应用与区别。通过详实的示例和优化的时序图,全面解析如何在实际项目中使用这些高级事务控制技巧,以提升开发者的Spring事务管理能力。
24 1
Spring高手之路24——事务类型及传播行为实战指南
|
4天前
|
XML Java 数据库连接
Spring中的事务是如何实现的
Spring中的事务管理机制通过一系列强大的功能和灵活的配置选项,为开发者提供了高效且可靠的事务处理手段。无论是通过注解还是AOP配置,Spring都能轻松实现复杂的事务管理需求。掌握这些工具和最佳实践,能
12 3
|
2月前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
1月前
|
Java 数据库 数据安全/隐私保护
Spring 微服务提示:使用环境变量抽象数据库主机名
Spring 微服务提示:使用环境变量抽象数据库主机名
40 1
|
1月前
|
Java 关系型数据库 MySQL
Spring事务失效,我总结了这7个主要原因
本文详细探讨了Spring事务在日常开发中常见的七个失效原因,包括数据库不支持事务、类不受Spring管理、事务方法非public、异常被捕获、`rollbackFor`属性配置错误、方法内部调用事务方法及事务传播属性使用不当。通过具体示例和源码分析,帮助开发者更好地理解和应用Spring事务机制,避免线上事故。适合所有使用Spring进行业务开发的工程师参考。
29 2
|
1月前
|
Java 程序员 Spring
Spring事务的1道面试题
每次聊起Spring事务,好像很熟悉,又好像很陌生。本篇通过一道面试题和一些实践,来拆解几个Spring事务的常见坑点。
Spring事务的1道面试题
|
1月前
|
监控 Java 对象存储
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
监控与追踪:如何利用Spring Cloud Sleuth和Netflix OSS工具进行微服务调试
42 1
|
1月前
|
安全 Java 对象存储
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
安全性考量:Spring Security与Netflix OSS在微服务安全中的作用
42 1