php中函数的分类(PHP微服务之分布式事务)PHP函数 / PHP函数在分布式系统中的应用...

wufei123 发布于 2024-05-19 阅读(23)

分布式事务一直是微服务的一个难点相关的解决方案和框架大部分是 java 的,那么 php 该如何解决呢?下面一步一步讲解如何用 php 解决分布式事务单机单数据源事务首先从单机事务开始大概逻辑如下 :try { // 开始事务 $db->beginTransaction(); // 执行你的操作 // ... // 提交事务 $db->commit(); } catch (Exception $e) { // 执行失败 回滚 $db->rollBack(); }

单机多个数据源事务如果你业务涉及到多个数据库,事务大概逻辑是这个样子:try { // 开始事务 $db1->beginTransaction(); $db2->beginTransaction(); // 执行你的操作 // ... // 提交事务 $db1->commit(); $db2->commit(); } catch (Exception $e) { // 执行失败 回滚 $db1->rollBack(); $db2->rollBack(); }

多机多数据源事务(分布式事务)如果你的数据源和业务代码都是分开的(微服务)这就是我们今天的核心由前面两种情况来看,大概逻辑是差不多的,主要也分为 4 个步骤开始事务执行逻辑代码提交事务回滚事务有些文章也称为 tcc 也就是 234 步骤。

我们用一个常用的例子:下单。主要 3 个步骤:创建订单修改库存修改用户积分假设订单,库存,用户都是独立的服务。按照前面的经验大概分为 4 个步骤,我们以用户为例代码如下:

库存 (stock),订单 (order) 和上面类似,也需要这 4 个方法,我就不写了难点在于我们没法直接操作数据源,只能通过 rpc 调用相应的服务来操作依次执行上面的方法就好了代码如下:try { // 开始事务 $user = new User(); $stock = new Stock(); $order = new Order(); $user = $user->beginTransaction(); $stock = $stock->beginTransaction(); $order = $order->beginTransaction(); // 执行你的操作 $user = $user->doTransaction(); $stock = $stock->doTransaction(); $order = $order->doTransaction(); // 提交事务 $user->commit(); $stock->commit(); $order->commit(); } catch (Exception $e) { // 执行失败 回滚 $user->rollBack(); $stock->rollBack(); $order->rollBack(); } 。

到这里可能有人看出问题来了,正常情况下这样肯定是不行的要上面这段代码成立需要满足 1 个条件:User 分别调用了 3 次,也就是 3 个请求要保证这 3 个请求是调用的同一个实例化后的对象Stock 和 Order 一样。

User 调用逻辑如下:// 第一次请求调用 $user = new User(); $user = $user->beginTransaction(); // 第二次请求调用 复用的第一次 $user $user = $user->doTransaction(); // 第三次请求调用 复用的第一次 $user $user->commit(); //或者 $user->rollBack();

one 框架 https://github.com/lizhichao/one极简高性能松耦合分布式可运行于多种环境one 框架完美支持上面的要求只需要把上面的 User、Stock 和 Order 添加为 rpc 服务即可。

还需要注意 beginTransaction 和 doTransaction 方法必须返回 $this 提供给后面的方法调用user 服务如下:RpcServer::add(User::class);

其他两个类似到此分布式事务问题就搞定了,可能觉得这么简单吗?这主要由于 one框架的 rpc 服务提供了链式调用(多个请求复用同一个对象)的功能可能有人要问:如果因为网络问题或者其他问题导致最后一个服务的最后一次调用失败了怎么办?。

解决方案就是事务补偿,你可以把这类极端的情况下的错误,放到一个队列里 起一服务来专门处理这里问题。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

河南中青旅行社综合资讯 奇遇综合资讯 盛世蓟州综合资讯 综合资讯 游戏百科综合资讯 新闻5216