当前位置:首页 >综合 >SpringBoot分布式事务之可靠消息最终一致性 如果执行失败则返回rollback

SpringBoot分布式事务之可靠消息最终一致性 如果执行失败则返回rollback

2024-06-30 17:30:22 [百科] 来源:避面尹邢网

SpringBoot分布式事务之可靠消息最终一致性

作者:Springboot实战案例锦集 开发 前端 如果broker未收到消息(如果执行本地事务突然宕机了,分布相当执行本地事务(executeLocalTransaction)执行结果返回unknow,式事则和broker未收到确认消息的可靠情况一样处理。

环境:springboot2.3.9 + RocketMQ4.8.0

可靠消息最终一致性原理

图片

SpringBoot分布式事务之可靠消息最终一致性 如果执行失败则返回rollback

  • 执行流程
  1. Producer发送Prepare message到broker。消息
  2. Prepare Message发送成功后开始执行本地事务。最终致性
  3. 如果本地事务执行成功的分布话则返回commit,如果执行失败则返回rollback。式事(这个是可靠在事务消息的回调方法里由开发者自己决定commit or rollback)
  4. Producer发送上一步的commit还是rollback到broker,这里有以下两种情况:

1、消息如果broker收到了commit/rollback消息 :

SpringBoot分布式事务之可靠消息最终一致性 如果执行失败则返回rollback

如果收到了commit,最终致性则broker认为整个事务是分布没问题的,执行成功的式事。那么会下发消息给Consumer端消费。可靠

SpringBoot分布式事务之可靠消息最终一致性 如果执行失败则返回rollback

如果收到了rollback,消息则broker认为本地事务执行失败了,最终致性broker将会删除Half Message,不下发给Consumer端。

2、如果broker未收到消息(如果执行本地事务突然宕机了,相当执行本地事务(executeLocalTransaction)执行结果返回unknow,则和broker未收到确认消息的情况一样处理。):

broker会定时回查本地事务的执行结果:如果回查结果是本地事务已经执行则返回commit,若未执行,则返回unknow。

Producer端回查的结果发送给Broker。Broker接收到的如果是commit,则broker视为整个事务执行成功,如果是rollback,则broker视为本地事务执行失败,broker删除Half Message,不下发给consumer。如果broker未接收到回查的结果(或者查到的是unknow),则broker会定时进行重复回查,以确保查到最终的事务结果。重复回查的时间间隔和次数都可配。

工程结构

图片图片

建立父子工程,两个子项目account-manager,integral-manager。

依赖

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-web</artifactId></dependency><dependency>  <groupId>org.apache.rocketmq</groupId>  <artifactId>rocketmq-spring-boot-starter</artifactId>  <version>2.2.0</version></dependency>

Account子模块

  • 配置文件
server:  port: 8081---rocketmq:  nameServer: localhost:9876  producer:    group: pack-mq---spring:  jpa:    generateDdl: false    hibernate:      ddlAuto: update    openInView: true    show-sql: true---spring:  datasource:    driverClassName: com.mysql.cj.jdbc.Driver    url: jdbc:mysql://localhost:3306/account?serverTimeznotallow=GMT%2B8    username: root    password:

(责任编辑:百科)

    推荐文章
    热点阅读