php微服务之【分布式事务】

分布式事务一直是微服务的一个难点。相关的解决方案和框架大部分是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个步骤。

  1. 开始事务
  2. 执行逻辑代码
  3. 提交事务
  4. 回滚事务

有些文章也称为tcc也就是 234 步骤。

我们用一个常用的例子:下单。
主要3个步骤:

  1. 创建订单
  2. 修改库存
  3. 修改用户积分

假设订单,库存,用户都是独立的服务。

按照前面的经验大概分为4个步骤,我们以用户为例 代码如下:

class User
{
	// 开始事务
	public function beginTransaction()
	{
		$db->beginTransaction();
		return $this;
	}
	
	// 执行代码
	public function doTransaction()
	{
		// 执行你的操作 
  		// ...
  		return $this;
	}
	
	public function commit()
	{
		$db->commit();
	}
	
	public funtion rollBack()
	{
		$db->rollBack();
	}

}

复制代码

库存(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个请求是调用的同一个实例化后的对象。StockOrder一样。

User 调用逻辑如下:


// 第一次请求调用
$user = new User();
$user = $user->beginTransaction();

// 第二次请求调用 复用的第一次 $user
$user = $user->doTransaction();

// 第三次请求调用 复用的第一次 $user
$user->commit();
//或者 
$user->rollBack();


复制代码

注意: 虽然调用了3次但是只new了一次, 第二次和第三次请求是复用的第一次的对象。要满足这个条件 服务供方必须 常驻内存 ,而且提供的rpc服务必须支持链式调用的功能。

one框架 github.com/lizhichao/o…
极简 . 高性能 . 松耦合 . 分布式 . 可运行于多种环境

one框架完美支持上面的要求。只需要把上面的UserStockOrder添加为rpc服务即可。还需要注意beginTransactiondoTransaction方法必须返回$this提供给后面的方法调用。

user服务如下:

RpcServer::add(User::class);

复制代码

其他两个类似。到此分布式事务问题就搞定了,可能觉得这么简单吗?这主要由于one框架的rpc服务提供了链式调用(多个请求复用同一个对象)的功能。

可能有人要问:如果因为网络问题或者其他问题导致最后一个服务的最后一次调用失败了怎么办? 解决方案就是事务补偿,你可以把这类极端的情况下的错误,放到一个队列里 起一服务来专门处理这里问题。

转载于:https://juejin.im/post/5cdfe3b9e51d451061721017

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、课程简介Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。       在本套课程中,我们将全面的讲解Spring Cloud技术栈, 从环境的部署到技术的应用,再到项目实战,让我们不仅是学习框架技术的使用,而且可以学习到使用Spring Cloud如何解决实际的问题。Spring Cloud各个组件相互配合,合作支持了一套完整的微服务架构。- 注册中心负责服务的注册与发现,很好将各服务连接起来- 断路器负责监控服务之间的调用情况,连续多次失败进行熔断保护。- API网关负责转发所有对外的请求和服务- 配置中心提供了统一的配置信息管理服务,可以实时的通知各个服务获取最新的配置信息- 链路追踪技术可以将所有的请求数据记录下来,方便我们进行后续分析- 各个组件又提供了功能完善的dashboard监控平台,可以方便的监控各组件的运行状况2、适应人群有一定的Java基础,并且要有一定的web开发基础。3、课程亮点       系统的学习Spring Cloud技术栈,由浅入深的讲解微服务技术。涵盖了基础知识,原理剖析,组件使用,源码分析,优劣分析,替换方案等,以案例的形式讲解微服务中的种种问题和解决方案l  微服务的基础知识n  软件架构的发展史n  微服务的核心知识(CAP,RPC等)l  注册中心n  Eureka搭建配置服务注册n  Eureka服务端高可用集群n  Eureka的原理和源码导读n  Eureka替换方案Consuln  Consul下载安装&服务注册&高可用l  服务发现与服务调用n  Ribbon负载均衡基本使用&源码分析n  Feign的使用与源码分析n  Hystrix熔断(雪崩效应,Hystrix使用与原理分析)n  Hystrix替换方案Sentinell  微服务网关n  Zuul网关使用&原理分析&源码分析n  Zuul 1.x 版本的不足与替换方案n  SpringCloud Gateway深入剖析l  链路追踪n  链路追踪的基础知识n  Sleuth的介绍与使用n  Sleuth与Zipkin的整合开发l  配置中心n  SpringClond Config与bus 开发配置中心n  开源配置中心Apollo4、主讲内容章节一:1.     微服务基础知识2.     SpringCloud概述3.     服务注册中心Eureka4.     Eureka的替换方案Consul章节二:1.     Ribbon实现客户端负载均衡2.     基于Feign的微服务调用3.     微服务熔断技术Hystrix4.     Hystrix的替换方案Sentinel章节三:1.     微服务网关Zuul的基本使用2.     Zuul1.x 版本的不足和替换方案3.     深入SpringCloud Gateway4.     链路追踪Sleuth与Zipkin章节四:1.     SpringCloud Config的使用2.     SpringCloud Config结合SpringCloud Bus完成动态配置更新3.     开源配置中心Apollo

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值