RocketMQ如何实现分布式事务

RocketMQ如何实现分布式事务

  1. A服务也就是发送方发送half message 到 broker服务端
  2. 当A服务指导半消息发送成功后,开始执行本地事务
  3. 执行本地事务会有三种情况(1,执行成功 2,执行失败 3,网络等原因没有响应)
    • 如果执行成功,返回commit
    • 如果执行失败,返回rollback
    • 如果没有收到响应,那么回查事务状态
  4. 根据事务的状态执行操作
    • 如果commit,那么提交到订阅方
    • 如果rollback,那么不投递消息,三天后删除
    • 如果没有收到确认,那么回查事务状态

Q : 为什么要先发送半消息 ?

A :

  1. 可以先确认broker服务器是否正常,如果半消息都发送失败了那么说明broker挂了。
  2. 可以通过半消息来回查事务,如果半消息发送成功后一直没有被二次确认,那么就会回查事务状态

Q : 什么情况会回查 ?

A :

  1. 执行本地事务的时候,由于网络等原因一直没有返回事务执行的结果(commit 或者 rollback)导致最终返回UNKNOW,那么就会回查。
  2. 本地事务执行成功后,发送commit消息的服务挂了,重启服务的时候,这个broker还是半消息,那么也会回查。(特别注意,如果回查,一定要先查看当前事务执行状态,再看是否需要重新执行本地事务。不然有可能执行两次本地事务)

分布式事务解决方案

CAP定理:

  • 一致性(Consistency) : 客户端知道一系列的操作都会同时发生。
  • 可用性(Availability):每个操作都必须以可预期的响应结束
  • 分区容错性(Partition tolerance):即使单个组件无法可用,操作依然可以完成

一、两阶段提交(2PC)

二阶段提交把事务分为两个阶段,并引入事务管理器

阶段一:

  1. 提交事务请求:协调者向所有的事务参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应。
  2. 执行事务:各个参与者节点执行事务操作。并将Undo和Redo信息记入日志事务中。
  3. 各参与者向协调者反馈事务询问的响应:如果参与者成功执行了实务操作,那么返回yes响应,如果执行事务失败了,那么返回no响应,表示事务不可执行。

阶段二:

  1. 执行事务提交:如果事务管理器从所有事务参与者获得的反馈都是yes,那么就会执行事务提交,协调者向所有参与者节点发出commit请求。
  2. 参与者提交事务:参与者在收到commit请求后,会正式执行事务的提交,并在提交完成后释放整个事务占用的资源,并向协调者发送ack信息
  3. 完成事务:协调者收到所有事务的ack信息后,完成事务
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值