Go微服务: 基于使用场景理解分布式之二阶段提交

概述

  • 二阶段提交(Two-Phase Commit,2PC)是一种分布式事务协议,用于在分布式系统中确保多个参与者的操作具有原子性
  • 即所有参与者要么全部提交事务,要么全部回滚事务,以维持数据的一致性
  • 它分为两个阶段进行:第一阶段:准备阶段(Prepare Phase),第二阶段:提交阶段(Commit Phase)

场景

  • 现在假设有这么一个场景: 用户下单成功添加积分服务, 同时扣减库存
  • 为什么上图是二阶段提交呢?
  • 首先看下订单的时候的扣减库存,扣减的时候,库存服务要开启本地的数据库事务,但是并未提交
  • 我们的业务,下订单的时候就给积分,调用积分服务,增加完积分时,也是开启本地数据库事务,也是不提交的
  • 这个时候,准备阶段已经结束了,这里有2个远程服务需要操作,这2个服务成功了,就可以本地生成订单和订单详情
  • 之后就是提交阶段,确认库存扣减可以commit了,确认积分增加可以commit了
  • 这样,我们就达到了2阶段提交,如果在生成订单和订单详情出错了,怎么办呢?看下图
  • 订单和订单详情的生成失败,说明了本地有问题,这样就需要告诉远程,这个操作失败,需要你们相关事务进行回滚
  • 这种二阶段提交,看似是非常好的一种解决方案,但是这里会不会有其他问题呢?
  • 首先,肯定有性能问题,在这两个阶段中,订单服务在协调库存服务和订单服务时,三者都是存在挂起的状态,也就是资源被锁住,只有当所有阶段性准备完毕,事务的协调着才会进行事务的提交,这里面性能损失比较大,在高并发下有非常大的风险
  • 其次,订单服务作为一个协调者,如果被协调者参与众多,这个过程就很长,这对性能是一个极大的考验,每个服务都会有超时时间,超时机制要随着服务的增加而增大,不增大的话,调用失败的失败率就会非常高
  • 还有,就是单个服务节点出现故障,比如订单服务这个节点出故障,库存服务和积分服务就不会提交,若库存或积分服务有问题或网络波动导致,订单没有收到响应,则订单取消,库存和积分事务回退,这种问题,如果积压过多,平台效能下降,也是一个问题
  • 以上是二阶段提交保证分布式数据一致性的问题
相关推荐
谢白羽12 小时前
多集群/分布式 LLM 推理方案全景:2026 年选型指南
分布式·vllm·sglang·llm-d
喵了几个咪12 小时前
Headless 架构优势:内容与展示解耦,一套 API 打通全端生态
vue.js·架构·golang·cms·react·taro·headless
Arva .12 小时前
RabbitMQ消费者处理失败
分布式·rabbitmq
yu859395812 小时前
基于MSP430 LaunchPad的蔬菜基地分布式无线低功耗温湿度监测系统
分布式·stm32·嵌入式硬件
renhongxia112 小时前
多机器人任务分配的事件触发自适应共识
人工智能·微服务·语言模型·机器人·prompt
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
做个文艺程序员2 天前
私有 LLM 多机多卡分布式推理:Pipeline Parallel vs Tensor Parallel 踩坑全记录
人工智能·分布式
咬_咬2 天前
go语言学习(基本数据类型)
开发语言·学习·golang·数据类型
搜佛说2 天前
01-第1章-概述与快速开始
物联网·golang·开源·软件工程·边缘计算·嵌入式实时数据库
foundbug9992 天前
Matlab基于分布式模型预测控制的多固定翼无人机共识控制
分布式·matlab·无人机