分布式事物

此处就不介绍分布式事物的概念了,分布式事物主要有三种方法  2pc、3pc、tcc、最终消息一致性

2pc

2pc即两段式提交

第一阶段:

        资源管理者rm向各资源参与者发送 prepare 消息,各参与者执行本地事物 写 redo,undo日志,但不提交

        参与者commit事物

 

3pc

3pc引入超时机制

在网络故障导致超时情况下,参与者会默认执行commit。

所以3pc存在的缺点  是 如果有某一个参与者 返回失败,则该故障的参与者无法收到abort,commit事物,会导致数据不一致。

 

tcc

tcc由支付宝提出,是一个应用层面的2pc

详见  https://www.liangzl.com/get-article-detail-525.html

 

最终消息一致性

详细可见这篇文章  https://blog.csdn.net/daijiguo/article/details/89059963

1、producer 发送事物消息到 broker,broker将该事物消息设置为不可见

2、producer执行本地事物

3、发送确认消息到broker,有三个返回值 

     LocalTransactionState.COMMIT_MESSAGE;
     LocalTransactionState.ROLLBACK_MESSAGE;
     LocalTransactionState.UNKNOW

将本地事务执行状态返回给broker,
  如果是COMMIT_MESSAGE,则将不可见消息变为可消费;
  如果是ROLLBACK_MESSAGE,broker会回收step1中的不可见消息,同时producer本地请手动回退(自己设计的回退方案,而非数据库的rollback,因为在虚线1中你已经将pruducer本地事务进行了commit);
  如果是UNKNOW或者producer与broker网络异常,broker会定时主动回调producer中的回调函数checkLocalTransaction()去判断producer本地事务是否正常(一般是查询数据库中数据是否已经持久化),broker定时主动查看producer本地事务的逻辑应该是写在rocket server的代码中,目前尚未找到源码,但是查阅各种资料和博客,都有提到。

4、消费者消费消息,即执行另外的事物

5、

如果有消息消费失败了,则将失败的消息回传给broker,即重新写入commitLog文件,消费者将重新消费;如果消息回传的时候,consumer和broker之间网络断开,则consumer会调用submitConsumeRequestLater()方法,在consumer端进行重新消费,如果仍然消费失败,会不断重试直到达到默认的16次,你可以使用msg.getReconsumeTimes()方法来获取当前重试次数,如果重试次数足够多之后仍然无法消费成功,必须通过工单、日志等方式进行人工干预以让producer事务进行回退处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值