关于分布式事务的理解

业务场景

电商业务

分布式事务.png

上图是一个电商系统,当一个订单支付完成后的业务场景:

  1. 更改订单的状态为 “已支付”
  2. 扣减商品库存
  3. 给会员增加积分
  4. 创建出库单通知仓库发货

想象一下,当订单支付完成后,个人积分延迟几分钟变更,这可以接受吗?

火车票购票

想想生活中火车票购票场景。

想象一下,当最后一张火车票同时被两个人购买,去检票口检票时被告知车票无效,这可以接受吗?

银行转账

想想生活中银行转账场景。

想象一下,当银行转账时,转账成功后,自己账户金额减少了,对方账户却一直未进账,这可以接受吗?

关于上述的三种业务需求场景,你是怎么理解和处理的?

在处理上述问题之前,咱们先来理解以下几个概念。

什么是事务?

事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

数据库事务大家肯定都很熟悉,在开发过程中会经常使用到。

事务的特性

  • Atomicity(原子性)
  • Consistency(一致性)
  • Isolation(隔离性)
  • Durability(持久性)

原子性 是指事务中的操作要么都不做,要么就全做。

一致性 是指事务必须是使数据库从一个一致性状态变到另一个一致性状态。

隔离性 是指一个事务的执行不能被其他事务干扰。

持久性 是指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

什么是分布式事务?

分布式事务是指一次大的操作由不同的小操作组成的,而这些小的操作分布在不同的服务器上,分布式事务需要保证这些小操作要么完全地执行,要么完成地不执行。

产生分布式事务的原因

  • 业务的微服务化,例如:文章开头所描述的电商业务场景。
  • 数据库分库分表,例如:当发生数据库分库分表后,有一个需求既要操作 01 库,又要操作 02 库。

分布式理论

CAP 理论

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance(分区容错性)

一致性 是指数据的强一致性,如果在某个节点更新了数据,那么在其他节点需要同时看到更新后的数据。

可用性 是指每个请求都能在合理的时间内获得符合预期的响应结果。

分区容错性 是指遇到任何网络分区故障的时候,系统仍然能够正常提供服务,除非是整个网络环境都发生了故障。

CAP.png

CAP 理论认为一个分布式系统最多只能同时满足其中的两项。由于分区容错性是必然存在的,所以大部分分布式软件系统都在 CP 和 AP 中做取舍。

例如:Zookeeper 采用 CP 一致性,强调一致性,弱化可用性,Eureka 采用 AP 可用性,强调可用性,弱化一致性。

BASE 理论

  • Basically Available(基本可用)
  • Soft state(软状态)
  • Eventually consistent(最终一致性)

基本可用 是指不追求强可用性,而且强调系统基本能够一直运行对外提供服务。当分布式系统遇到不可预估的故障时,允许一定程度上的不可用,比如:对请求进行限流排队,对非核心服务进行降级。

软状态 是指允许系统中的数据存在中间状态,而不是事务的原子性:要么全部成功,要不全部不成功。

最终一致性 是指数据不可能一直都是软状态,必须在一个时间期限之后达到各个节点的一致性,在此之后,所有的节点的数据都是一致的,系统达到最终一致性。

BASE 理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。

解决方案

2PC(两阶段提交协议)

3PC(三阶段提交协议)

TCC

本地消息表

RocketMQ 事务消息

小结

本文纯属抛砖引玉,有问题,欢迎批评指正。

关于分布式事务的可落地方案,我会在后续文章中进行介绍。

推荐阅读


新亮笔记
技术的深度和广度只能靠自己努力去发掘,谁也不能替你学习,在这里希望你能有所收获。

日拱一卒

2.9k 声望
1.2k 粉丝
0 条评论
推荐阅读
关于项目中 Repository 层的思考
维护这一层的开发者,可以称为 仓库管理员 ,当使用者需要查询数据的时候,需要告诉仓库管理员,由仓库管理员拿给他,至于仓库管理员从哪拿的数据,使用者无需关系。

新亮2阅读 1.8k评论 1

从零搭建 Node.js 企业级 Web 服务器(十五):总结与展望
总结截止到本章 “从零搭建 Node.js 企业级 Web 服务器” 主题共计 16 章内容就更新完毕了,回顾第零章曾写道:搭建一个 Node.js 企业级 Web 服务器并非难事,只是必须做好几个关键事项这几件必须做好的关键事项就...

乌柏木75阅读 7.1k评论 16

从零搭建 Node.js 企业级 Web 服务器(一):接口与分层
分层规范从本章起,正式进入企业级 Web 服务器核心内容。通常,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,如下图:从上至下,抽象层次逐渐加深。从下至上,业务细节逐渐清晰。视图...

乌柏木45阅读 8.5k评论 6

从零搭建 Node.js 企业级 Web 服务器(二):校验
校验就是对输入条件的约束,避免无效的输入引起异常。Web 系统的用户输入主要为编辑与提交各类表单,一方面校验要做在编辑表单字段与提交的时候,另一方面接收表单的接口也要做足校验行为,通过前后端共同控制输...

乌柏木35阅读 6.7k评论 10

一文搞懂秒杀系统,欢迎参与开源,提交PR,提高竞争力。早日上岸,升职加薪。
前言秒杀和高并发是面试的高频考点,也是我们做电商项目必知必会的场景。欢迎大家参与我们的开源项目,提交PR,提高竞争力。早日上岸,升职加薪。知识点详解秒杀系统架构图秒杀流程图秒杀系统设计这篇文章一万多...

王中阳Go33阅读 2.4k评论 1

封面图
从零搭建 Node.js 企业级 Web 服务器(五):数据库访问
回顾 从零搭建 Node.js 企业级 Web 服务器(一):接口与分层,一块完整的业务逻辑是由视图层、控制层、服务层、模型层共同定义与实现的,控制层与服务层实现了业务处理过程,模型层定义了业务实体并以 对象-关系...

乌柏木34阅读 5k评论 9

从零搭建 Node.js 企业级 Web 服务器(十三):断点调试与性能分析
Node.js 官方提供了断点调试机制,出于安全性考虑默认为关闭状态,可以通过 node 参数 --inspect 或 --inspect-brk 开启,配合 IDE 能够非常方便地调试代码,本章就上一章已完成的项目 licg9999/nodejs-server-ex...

乌柏木31阅读 4.2k评论 9

日拱一卒

2.9k 声望
1.2k 粉丝
宣传栏