面试官问:你讲讲分布式事务问题的几种方案?

2023-05-16

本文转自

芋道源码 

https://mp.weixin.qq.com/s/9KKY3pCKNkz1VOVEzdXp5g

  • 面试题

  • 面试官心理分析

  • 面试题剖析

    • 两阶段提交方案/XA方案

    • TCC 方案

    • 本地消息表

    • 可靠消息最终一致性方案

    • 最大努力通知方案

    • 你们公司是如何处理分布式事务的?


面试题

1、分布式事务了解吗?

2、你们是如何解决分布式事务问题的?

面试官心理分析

只要聊到你做了分布式系统,必问分布式事务,你对分布式事务一无所知的话,确实会很坑,你起码得知道有哪些方案,一般怎么来做,每个方案的优缺点是什么。

现在面试,分布式系统成了标配,而分布式系统带来的分布式事务也成了标配了。因为你做系统肯定要用事务吧,如果是分布式系统,肯定要用分布式事务吧。先不说你搞过没有,起码你得明白有哪几种方案,每种方案可能有啥坑?比如 TCC 方案的网络问题、XA 方案的一致性问题。

面试题剖析

分布式事务的实现主要有以下 5 种方案:

  • XA 方案

  • TCC 方案

  • 本地消息表

  • 可靠消息最终一致性方案

  • 最大努力通知方案

两阶段提交方案/XA方案

所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;如果任何其中一个数据库回答不 ok,那么就回滚事务。

这种分布式事务方案,比较适合单块应用里,跨多个库的分布式事务,而且因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景。如果要玩儿,那么基于 Spring+JTA 就可以搞定,自己随便搜个 demo 看看就知道了。

这个方案,我们很少用,一般来说某个系统内部如果出现跨多个库的这么一个操作,是不合规的。我可以给大家介绍一下, 现在微服务,一个大的系统分成几十个甚至几百个服务。一般来说,我们的规定和规范,是要求每个服务只能操作自己对应的一个数据库

如果你要操作别的服务对应的库,不允许直连别的服务的库,违反微服务架构的规范,你随便交叉胡乱访问,几百个服务的话,全体乱套,这样的一套服务是没法管理的,没法治理的,可能会出现数据被别人改错,自己的库被别人写挂等情况。

如果你要操作别人的服务的库,你必须是通过调用别的服务的接口来实现,绝对不允许交叉访问别人的数据库。

TCC 方案

TCC 的全称是:Try、Confirm、Cancel。

  • Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行锁定或者预留

  • Confirm 阶段:这个阶段说的是在各个服务中执行实际的操作

  • Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是执行已经执行成功的业务逻辑的回滚操作。(把那些执行成功的回滚)

这种方案说实话几乎很少人使用,我们用的也比较少,但是也有使用的场景。因为这个事务回滚实际上是严重依赖于你自己写代码来回滚和补偿了,会造成补偿代码巨大,非常之恶心。

比如说我们,一般来说跟相关的,跟钱打交道的,支付交易相关的场景,我们会用 TCC,严格保证分布式事务要么全部成功,要么全部自动回滚,严格保证资金的正确性,保证在资金上不会出现问题。

而且最好是你的各个业务执行的时间都比较短。

但是说实话,一般尽量别这么搞,自己手写回滚逻辑,或者是补偿逻辑,实在太恶心了,那个业务代码很难维护。

本地消息表

本地消息表其实是国外的 ebay 搞出来的这么一套思想。

这个大概意思是这样的:

  1. A 系统在自己本地一个事务里操作同时,插入一条数据到消息表;

  2. 接着 A 系统将这个消息发送到 MQ 中去;

  3. B 系统接收到消息之后,在一个事务里,往自己本地消息表里插入一条数据,同时执行其他的业务操作,如果这个消息已经被处理过了,那么此时这个事务会回滚,这样保证不会重复处理消息

  4. B 系统执行成功之后,就会更新自己本地消息表的状态以及 A 系统消息表的状态;

  5. 如果 B 系统处理失败了,那么就不会更新消息表状态,那么此时 A 系统会定时扫描自己的消息表,如果有未处理的消息,会再次发送到 MQ 中去,让 B 再次处理;

  6. 这个方案保证了最终一致性,哪怕 B 事务失败了,但是 A 会不断重发消息,直到 B 那边成功为止。

这个方案说实话最大的问题就在于严重依赖于数据库的消息表来管理事务啥的,会导致如果是高并发场景咋办呢?咋扩展呢?所以一般确实很少用。

可靠消息最终一致性方案

这个的意思,就是干脆不要用本地的消息表了,直接基于 MQ 来实现事务。比如阿里的 RocketMQ 就支持消息事务。

大概的意思就是:

  1. A 系统先发送一个 prepared 消息到 mq,如果这个 prepared 消息发送失败那么就直接取消操作别执行了;

  2. 如果这个消息发送成功过了,那么接着执行本地事务,如果成功就告诉 mq 发送确认消息,如果失败就告诉 mq 回滚消息;

  3. 如果发送了确认消息,那么此时 B 系统会接收到确认消息,然后执行本地的事务;

  4. mq 会自动定时轮询所有 prepared 消息回调你的接口,问你,这个消息是不是本地事务处理失败了,所有没发送确认的消息,是继续重试还是回滚?一般来说这里你就可以查下数据库看之前本地事务是否执行,如果回滚了,那么这里也回滚吧。这个就是避免可能本地事务执行成功了,而确认消息却发送失败了。

  5. 这个方案里,要是系统 B 的事务失败了咋办?重试咯,自动不断重试直到成功,如果实在是不行,要么就是针对重要的资金类业务进行回滚,比如 B 系统本地回滚后,想办法通知系统 A 也回滚;或者是发送报警由人工来手工回滚和补偿。

  6. 这个还是比较合适的,目前国内互联网公司大都是这么玩儿的,要不你举用 RocketMQ 支持的,要不你就自己基于类似 ActiveMQ?RabbitMQ?自己封装一套类似的逻辑出来,总之思路就是这样子的。

最大努力通知方案

这个方案的大致意思就是:

  1. 系统 A 本地事务执行完之后,发送个消息到 MQ;

  2. 这里会有个专门消费 MQ 的最大努力通知服务,这个服务会消费 MQ 然后写入数据库中记录下来,或者是放入个内存队列也可以,接着调用系统 B 的接口;

  3. 要是系统 B 执行成功就 ok 了;要是系统 B 执行失败了,那么最大努力通知服务就定时尝试重新调用系统 B,反复 N 次,最后还是不行就放弃。

你们公司是如何处理分布式事务的?

如果你真的被问到,可以这么说,我们某某特别严格的场景,用的是 TCC 来保证强一致性;然后其他的一些场景基于阿里的 RocketMQ 来实现分布式事务。

你找一个严格资金要求绝对不能错的场景,你可以说你是用的 TCC 方案;如果是一般的分布式事务场景,订单插入之后要调用库存服务更新库存,库存数据没有资金那么的敏感,可以用可靠消息最终一致性方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试官问:你讲讲分布式事务问题的几种方案? 的相关文章

  • C++实现插入排序算法(直接插入排序、折半插入排序、希尔排序)

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C++实现二路归并排序算法

    排序算法分为五大类 xff0c 一共是有九种 xff0c 如下 xff1a 插入类 xff1a 直接插入排序 折半插入排序 希尔排序 交换类 xff1a 冒泡排序 快速排序 选择类 xff1a 简单选择排序 堆排序 归并类 xff1a 二路
  • C语言实现-学生信息管理系统

    通过C语言实现一个学生信息管理系统 xff0c 要求如下 xff1a xff08 1 xff09 用户采用自己账号和密码登录系统 xff1b xff08 2 xff09 学生信息和账号密码通过文件的形式存储 xff1b xff08 3 xf
  • 通过python画矢量图(matplotlib,有代码)

    python画矢量图 xff08 有代码 xff09 python的matplotlib可以保存的文件格式word可以插入哪些图片格式呢代码中文乱码问题 有些同学因为文章的要求 xff0c 图片插入到word里的时候需要足够清晰 xff0c
  • Java实现LRU

    首先看看什么是LRU LRU是Least Recently Used的缩写 xff0c 即最近最少使用 xff0c 是一种常用的页面置换算法 xff0c 选择最近最久未使用的页面予以淘汰 该算法赋予每个页面一个访问字段 xff0c 用来记录
  • 域名cdn加速(apache与nginx)

    一 xff1a 由于公司业务属于请求量比较大的吧 xff0c 每个月几亿条 xff0c 考虑到安全性 xff0c 所以需要域名由http改为https cdn加速才可以支成撑业务 二 xff1a 之前的系统是使用lamp配置的 xff0c
  • ubuntu系统安装完nvidia显卡驱动后黑屏,不能进入系统

    我之前安装了系统里建议安装的nvidia 380显卡驱动 xff0c 为了安装更高版本的CUDA xff0c 我将nvidia显卡驱动升级到了430 xff0c 但是重启电脑进入Ubuntu系统时黑屏 xff0c 进不去系统界面 xff0c
  • 黑盒模糊测试之AFL++

    git clone depth 1 https github com AFLplusplus AFLplusplus cd AFLplusplus make Build Summary 43 afl fuzz and supporting
  • centos7安装MySQL5.7

    一 下载mysql5 7 1 下载地址 mysql 5 7 28 1 el7 x86 64 rpm bundle tar 2 上传至服务器 3 解压压缩包 解压命令 tar xvf mysql 5 7 28 1 el7 x86 64 rpm
  • 打包VSCode源码为安装程序(.exe)

    参考博客 GitHub vscode里的Packaging部分 xff1a https github com microsoft vscode wiki How to Contribute 这里提供了vscode打包后可以发布的平台代码 x
  • Ubuntu的安装卡在安装界面 (解决方法记录)

    安装过程 在 Install Ubuntu 的grub 选项上点击e 在 Linux 系统的启动参数 倒数第二行 中加入 nomodset 安装界面分辨率会有问题 xff0c 但这个之后再解决 安装过程中 xff0c 如果需要拖拽窗口 Al
  • 树莓派ubuntuMATE 安装xrdp来进行显示图形的远程调试

    树莓派ubuntuMATE 安装xrdp来进行显示图形的远程调试 引 在树莓派上调试显示图形界面的项目 xff0c 纠结配显示器的问题 pi本身有hdmi的接口 xff0c 如果有多余的显示器直接连接的那最好 xff0c 倘若接口不合适也可
  • C与C++源文件的拼接

    C 43 43 与C处理函数名 如果C 43 43 两个cpp源文件中函数名称相同 xff0c 会出现如下错误 xff08 ave就是函数名 xff09 34 int cdecl ave void 34 ave 64 64 YAHXZ 已经
  • 【Android-Socket】Socket通信笔记(单例模式,线程管理,AsyncTask)

    扉 本作学习视频来源 https www bilibili com video BV1Nx411r7Pr t 61 940 amp p 61 11界面参考 https blog csdn net fszeng2011 article det
  • 明明安装了anaconda,conda命令一直无效

    添加路径到bashrc里 export PATH 61 34 home xxx anaconda3 bin PATH 34 source 一下bashrc source bashrc

随机推荐

  • 云计算ACP练习题(一)

    阿里云计算绿网是云盾体系内的业务防护模块 xff0c 它的作用是保护网站内容的安全 xff0c 提前发现不符合政策规定的信息 以下对绿网功能的描述最准确的是 A 自动判别文本内容和图片是否合规 xff0c 支持API批量检测图片 B 只支持
  • 解决Linux字符界面中文变方框的问题

    图形界面控制台中输入init 3可以跳转到字符界面 xff0c 如果遇到含有中文目录且中文变成方框的问题 xff0c 可以尝试安装zhcon xff0c 然后做一下设置 xff0c 具体步骤如下 xff1a 终端下输入 xff1a sudo
  • 【报错解决方案】W: GPG error: http://dl.google.com/linux/chrome/deb stable InRelease

    0x00 问题描述 今天用apt update 更新apt源的时候 xff0c 曝出了 xff1a W GPG error http dl google com linux chrome deb stable InRelease The f
  • 磁盘满载导致的ubuntu远程连接xrdp失效问题

    远程连接断开主要三大原因 xff1a sshd服务和Xrdp服务未打开 防火墙拦截 电脑故障 SSHD网络服务和XRDP服务检测可以通过端口号监听查看service sshd status service xrdp status 也可以直接
  • MySQL入门指南3(常用函数)

    目录 一 常用函数 1 合计 统计函数 2 字符串相关函数 3 数学相关函数 4 加密和系统函数 5 流程控制函数 二 最后的话 一 常用函数 1 合计 统计函数 1 1 COUNT 用于统计表中记录 xff08 行 xff09 的数量 x
  • PAT A1153

    题目 xff1a https pintia cn problem sets 994805342720868352 problems 1071785190929788928 这道题我很久才AC xff0c 主要是不知道原来它的输入可以乱来 我
  • 在anaconda中新建和配置开发环境

    在anaconda中新建和配置开发环境 1 打开anaconda xff0c 来到主界面 2 单击Environment xff0c 进入开发环境列表 3 单击Open Terminal 进入命令行 4 在命令行中输入conda creat
  • 深度学习安装libmr\win10安装visual studio C++ build tools 提示安装包丢失或毁坏

    首先是做深度学习需要安装libMR xff0c 但苦于windos安装需要下载包导入而不能直接pip xff1a 这部分参考 35条消息 Python 在Windows环境安装libMR SuGarSJL的博客 CSDN博客 https b
  • 树莓派Raspberry Pi 3B+ 安装OpenWrt及配置(有线、无线联网,AP)

    OpenWrt官方介绍 OpenWrt项目是一个针对嵌入式设备的Linux操作系统 OpenWrt不是一个单一且不可更改的固件 xff0c 而是提供了具有软件包管理功能的完全可写的文件系统 这使您可以不使用供应商提供的应用程序选择和配置 x
  • 最大公约数(greatest common divisor)

    题目描述 有n个数字a1 a2 a3 an 求max gcd ai aj i 61 j gcd x y 表示x与y的最大公约数 输入格式 第一行一个整数n 之后一行n个数 xff0c 表示a1 a2 a3 an 输出格式 输出一个整数表示答
  • 尝试解读resize-observer-polyfill源码(1)

    00本人前端菜鸡一只 xff0c 这是我的第一个源码解读文章 xff0c 持续更新中 首先 xff0c 从获取源码 由工程根目录下的rollup config js可知 xff0c 这个工程是使用rollup打包的 打开之后可以看到具体配置
  • Spring cloud Gateway 指定执行过滤器 (在配置文件中配置所需要过滤器)

    gateway 相关文章 Spring cloud gateway 处理跨域问题 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff
  • spring cloud gateway 处理跨域问题

    Spring cloud gateway 设置https 和http同时支持 Spring cloud gateway 拦截请求404 等HTTP 状态码 Spring cloud gateway 修改response 截断问题 xff0c
  • IntelliJ IDEA 15款 神级超级牛逼插件推荐(自用,真的超级牛逼)

    目录 满满的都是干货 所有插件都是在 ctrl 43 alt 43 s 里的plugins 里进行搜索安装 1 CodeGlance 代码迷你缩放图插件 2 Codota 安装 xff1a 3 Material Theme UI 4 Ali
  • elasticsearch 安装常见问题解决办法

    本文章记录安装es过程中碰到的各种常见问题及解决方案 目录 本文章记录安装es过程中碰到的各种常见问题及解决方案 1 elasticsearch 7 6 1 bin elasticsearch 启动报以杀死 这个问题 没有生成其他日志 只有
  • mysql my.ini

    Mysql my ini client 设置mysql客户端默认字符集 default character set 61 utf8 mysql 设置mysql客户端默认字符集 default character set 61 utf8 us
  • 看了这篇文!你就知道是选 elasticsearch 还是 solr

    什么是全文搜索引擎 本词条由 科普中国 科学百科词条编写与应用工作项目 审核 全文搜索引擎就是通过从互联网上提取的各个网站的信息 xff08 以网页文字为主 xff09 而建立的数据库中 xff0c 检索与用户查询条件匹配的相关记录 xff
  • GitHub宣布现在对团队免费

    原文 xff1a GitHub宣布对所有人私有仓库免费 https github blog 2020 04 14 github is now free for teams 我们很高兴地宣布 xff0c 我们正在为所有GitHub帐户提供不受
  • 知道什么是CAP吗?不知道还敢称程序员?搞笑呢?

    分布式系统 xff08 distributed system xff09 正变得越来越重要 xff0c 大型网站几乎都是分布式的 分布式系统的最大难点 xff0c 就是各个节点的状态如何同步 CAP 定理是这方面的基本定理 xff0c 也是
  • 面试官问:你讲讲分布式事务问题的几种方案?

    本文转自 芋道源码 https mp weixin qq com s 9KKY3pCKNkz1VOVEzdXp5g 面试题 面试官心理分析 面试题剖析 两阶段提交方案 XA方案 TCC 方案 本地消息表 可靠消息最终一致性方案 最大努力通知