RocketMQ如何解决分布式事务


本篇内容主要讲解“RocketMQ如何解决分布式事务”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RocketMQ如何解决分布式事务”吧!RocketMQ解决分布式事务(可靠消息最终一致性方案)1、A系统发送一个prepared消息到MQ,如果这个prepared消息发送失败那么就直接取消操作别执行了。2、如果这个消息发送成功了、就接着执行本地事务(executeLocalTransaction),如果成功就告诉MQ发送确认消息,如果失败,就告诉MQ发送回滚消息。3、如果发送了确认消息、那么B系统会接收到确认消息,然后执行本地事务。4、上面的第2步,由于网络原因发送确认or回滚消息失败,但是broker有轮询机制,根据唯一id查询本地事务状态,MQ会自动定时轮询所有prepared消息回调你的接口(checkLocalTransaction),问你,这个消息是不是本地事务处理失败了,所有没有发送确认的消息,是继续重试还是回滚?一版来说这里你就可以查下数据库看之前本地事务是否执行,如果回滚了,那么这里也回滚吧。这个就是避免可能本地事务执行成功了,而确认消息却发送失败了。PS:此方案是不支持事务发起服务进行回滚的,但是大部分互联网应用都不会要求事务发起方进行回滚,如果一定要事务发起方进行回滚应该采用2PC、3PC、TCC等强一致性方案来实现分布式事务,比如LCN。这里通过一个实例来讲一下RocketMQ实现分布式事务具体编码。场景: 下单场景,订单服务生成订单,当订单支付成功之后,修改订单状态已支付,并且要通知库存服务进行库存的扣减。在终端或者浏览器 执行 curl ‘127.0.0.1:8081/order/save?num=2&good_id=1&user_id=1001’OrderController:pay 发送订单支付成功的MQ事务消息,这里注意体会,并不是直接调用OrderService::updatePayStatusByOrderId 然后发送普通的MQ消息。而是先发送事务消息到MQ,然后MQ回调订单服务的TransactionListener::executeLocalTransaction,在这里完成订单状态的更新,保证发送事务消息和更新订单状态的一致性.需要注意的问题:1. 扣减库存要防止在并发的情况下被扣成负数2. 先select后update的方式更新库存要加分布式锁或者数据库乐观锁,update语句需要是幂等的 UPDATE t_yue SET money=$new_mo 香港云主机ney WHERE id=$good_id AND money=$old_money;3. 注意通过msgId或者orderId来进行消费幂等处理到此,相信大家对“RocketMQ如何解决分布式事务”有了更深的了解,不妨来实际操作一番吧!这里是开发云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

相关推荐: 怎么在电脑上关闭pximouse进程

小编给大家分享一下怎么在电脑上关闭pximouse进程,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!解决 香港云主机方法/步骤:1.调出运行窗口,输入msconfig命令后回车。2.电脑会弹出系统配置界面,随后切换到启动选项,打开任务管理器。…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 07/27 18:18
下一篇 07/27 19:01

相关推荐