当前位置: 首页 > 后端技术 > PHP

Laravel基于RT模式实现分布式事务(突破性技术支持子服务嵌套事务)

时间:2023-03-30 00:04:29 PHP

快速预览安装laravel5.5-laravel8之间的版本,然后安装composer包##Composer2版本必须使用composerrequirewindawake/laravel-reset-transactiondev-master先创建order、storage、account3个mysql数据库实例,3个controller和3个model,在phpunit.xml中添加testsuiteTransaction,然后启动webserver。这些操作只需要执行以下命令即可完成所有phpartisanresetTransact:create-examples&&phpartisanserve--host=0.0.0.0--port=8000另开一个终端,用8001端口启动交易中心,或者更改它去版本交易中心https://github.com/windawake/...phpartisanserve--host=0.0.0.0--port=8001最后运行测试脚本`./vendor/bin/phpunit--testsuite=Transaction--filter=ServiceTest`运行结果如下,3个实例通过测试。DESKTOP:/web/linux/php/laravel/laravel62#./vendor/bin/phpunit--testsuite=Transaction--filter=ServiceTestTime:219ms,Memory:22.00MBOK(3tests,12assertions)功能开箱即用无需重构原项目代码,与mysql事务写法一致,简单易用。强一致性事务分两阶段提交,高并发下,支持读提交事务隔离级别,数据一致性几乎100%。性能超越seataAT模式。由于交易被拆成几笔,就变成了好几笔小交易。压测发现死锁比正常的MySQL事务少。支持分布式事务嵌套,与Savepoint一致。支持避免不同业务代码并发造成的脏数据问题。默认支持http协议的服务接口。如果要支持其他协议,需要重写中间件。支持子服务嵌套分布式事务(突破性技术)。支持服务,本地事务和分布式事务混合嵌套支持超时3次重试,重复请求保证幂等性支持几乎所有的SQL语句,批量插入,批量更新,批量删除(突破性技术)支持检测由xapreparelock引起的,释放xalock更准确的说,支持go、java语言(开发中)与阿里seataAT模式相比,有什么优势?请阅读https://learnku.com/articles/...可行性报告请阅读https://learnku.com/articles/...解决了哪些并发场景[x]一个待发货的订单,用户在同时操作发货和取消订单时,只有一次成功的[x]积分可以兑换优惠券。只要积分不够抵扣或者优惠券存量不够抵扣,都会失败。原理分析ResetTransaction,中文名是复位型分布式事务,也叫RT模式,和seataAT模式都是两阶段提交。与中国电视剧中的“穿越”同义。如果你看过电影《明日边缘》,你就会知道归档和加载的操作。这个分布式事务组件模仿了《明日边缘》movie的原理。每次请求基础服务时,都是先读取文件,再继续后面的操作。整个过程是遵守两阶段提交协议,先准备,最后提交。以创建订单并扣除库存的场景为例,绘制如下流程图。右图开启分布式事务RT模式后,请求数4比左图多。请求4做的就是请求1-3之前做的,又回到原点重新开始,最后提交交易,结束创建订单的过程。支持子服务嵌套分布式事务(突破性技术)是世界级难题:A服务提交->B服务回滚->C服务提交->D服务提交sql,这种场景下,ABCD是不同的数据库,如何Can服务A提交服务B并回滚服务C和服务D的所有操作是否实现?seata和go-dtm都不能解决这个问题。解决问题的关键是服务C和服务D必须是虚假提交,不能真实提交。如果真的提交了,就没有办法恢复了。支持子服务嵌套分布式事务有什么好处?一个服务可以做成别人的服务,也可以嵌套在链接的任何层级。打破以往的束缚:一个服务必须是根服务,而A服务要想成为子服务,代码必须要有很大的改动。如果使用RT模式,A服务可以不修改代码就变成别人的服务。如何在laravel框架中使用,用RT替换门面DB实现分布式事务。put('http://127.0.0.1:8000/api/resetOrder/11',['json'=>['order_no'=>'aaa',],'headers'=>['rt_request_id'=>session_create_id(),//支持幂等'rt_transact_id'=>RT::getTransactId(),//让订单服务知道,当前在分布式事务中]]);RT::提交();具体示例请参考composer包中vendor/windawake/laravel-reset-transaction/examples/tests/Transaction/ServiceTest.php的代码。个人笔记本人之前写过laravel快服务包,但是没有解决数据一致性问题。尝试使用XA,但是XA只能解决跨数据不能解决跨服务的问题。然后尝试研究了tcc和seata,这两个东西好学难用。我别无选择,只能创建分布式事务解决方案。一直以来,我一直认为只用mysql解决不了分布式事务的问题。现在终于明白,还是有办法的!希望更多的朋友互相学习,一起学习分布式事务的知识。相关资源laravel版本:https://github.com/windawake/...https://gitee.com/windawake/l...hyperf版本(含压测报告):https://github.com/windawake/...https://gitee.com/windawake/h...去版本事务中心https://github.com/windawake/...