利用Rocketmq4.2版来实现分布式事务

花了点时间学了RocketMQ,下面是本人的一点点心得,但如果你要借鉴话,我还是劝你看下面参考资料里的视频(作者为阿里牛人),虽然他分享的视频是为了推销阿里云的DRDS、ONS(RocketMQ阿里版),只是讲了个大概,没有细说,但是指明一个大的方向,让人非常的受益。

目录

一、为什么要使用 RocketMQ ?

1. 单机跨机事务 TPS 增加的原因.

2. 拆分单机跨机事务为分布式事务后, 分布式事务的 TPS 反而比单机事务的 TPS 还要少

二、RocketMQ:

三、分布式事务流程: 如下图

1. 消费者集群事务:

2. 生产者集群事务:


一、为什么要使用 RocketMQ ?

分析单机跨机事务拆分成分布式事务TPS 的影响, 从侧面说明为什么要使用分布式事务, 而实现分布式事务的前提必须要有一个中间件(如: RocketMQ)支持(借用阿里牛人视频中的ppt)。

1. 单机跨机事务 TPS 增加的原因.

  • 假设单机事务的 TPS: 5.004ms.

  • 单机的跨机事务的 TPS : 11.004ms, 由于三次的跨机网络传输, 事务耗时增加了 6ms 

2. 拆分单机跨机事务为分布式事务后, 分布式事务的 TPS 反而比单机事务的 TPS 还要

  • 图中左边的事务3与事务5需要远程网络调用, 根据账户拆分成俩个异步单机事务, 这就避免了网络通信, 从而减少不必要的网络开销.

  • 要实现拆分成两个异步单机事务单元, 必须引入一个消息中间件, 来解耦两个异步事务.

  • 分布式事务: 消息发送者端的单机事务, 消息发送者端通过消息集群完整的事务流程,ONS消息集群这里用 rocketMQ 集群代替。

 

  • 分布式事务: 消息接收者端的单机事务, 下图为消息接收者端通过消息集群完整的事务流程。(后面有详情讲解消息超时与重复的问题)

 

 

 

二、RocketMQ:

RocketMQ在 V3.1.5 开始,使用 数据库 实现【事务状态】的存储。但未开源,因为rocketmq阉割了对生产者的LocalTransactionState状态的回查机制,所以增加了生产端事务的复杂度。在 2019 年的某个版本又开源了内置回查机制,详情查看http://rocketmq.apache.org/docs/simple-example/可以直接用RocketMQ的回查机制的API来确认是否消息发送成功,不需要另外设置回查表值来查询确认消息是否成功。

(更新:因 RocketMQ 新版本又开源了内置回查机制,删除了部分旧内容,流程图为旧内容, 源文件找不到, 人又懒,所以流程图不改了,请读者见谅)

 

三、分布式事务流程: 如下图

 

分发布式事务通过消息中间件解耦为相互独立的(本地事务+异步)而本地事务间消息传递统一由消息中间件负责

1. 消费者集群事务

  1. 在执行本地事务时要注意:本地事务要尽量保证幂等性(如s*s = s,也就是事务不管执行多少次结果都一样),如不能保证幂等性,要在业务上去对消息消费的去重(如:通过唯一业务ID 去重 或 在消费者集群添加去重表,在事务开始前校验此消息是否重复,在事务提交前插入相关数据。去重表具体参见生产者集群事务的回查表,可以省略count字段)。因为RocketMQ不保证信息不重复,虽然重复几率很小。
  2. 对于消费者集群执行本地事务失败(含重试机制)的情况,阿里提供给我们的解决方法是:人工解决。按照事务的流程,因为某种原因事务失败,那么需要回滚整个流程。如果消息系统要实现这个回滚流程的话,系统复杂度将大大提升,且很容易出现Bug,估计出现Bug的概率会比消费失败的概率大很多。这也是RocketMQ目前暂时没有解决这个问题的原因,在设计实现消息系统时,我们需要衡量是否值得花这么大的代价来解决这样一个出现概率非常小的问题,这也是大家在解决疑难问题时需要多多思考的地方。
  3. 对于阿里来说,一个分布式事务可以能涉及的是几百个子系统,对于他们来说处理分布式事务回滚代价太大;但对于的分布式事务只涉及几个子系统,回滚不太复杂的情况下,我想是否可以对回滚分布式事务可以用一个反向的分布式事务解决,代价就是在消费端本地事务处理失败,回滚本地事务后发送一条分布式事务失败消息给生产者。而生产者需要额外为分布式事务设计相对应的回滚分布式事务的接口。视频中的阿里牛人说阿里分布式事务中消费失败的几率很小,在他印象中一两年才出现一次,这样的几率是否值得我们去做一个回滚分布式事务的设计呢?

-------------------------------------------------------------------------------------

2. 生产者集群事务:

更新:RocketMQ新版本又开源了内置回查机制,这里的生产者的回查表不需要了。详情查看http://rocketmq.apache.org/docs/simple-example/

  • 解决方案流程图:

(更新:因 RocketMQ 新版本又开源了内置回查机制,流程图为旧内容, 源文件找不到, 人又懒,所以流程图不改了,回查表机制用内置的回查机制代替就行了, 请读者见谅,  删除了部分旧内容.)

 

参考资料:

http://v.youku.com/v_show/id_XODY4ODE3OTY0.html?from=s1.8-1-1.2          

强烈建议看他的视频:总共有十个视频,都是关于分布式事务与RocketMQ。

https://www.jianshu.com/p/453c6e7ff81c 根据上面视频而写的。

https://segmentfault.com/a/1190000009512510 事务源码

 

 

  • 6
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值