被面试官质疑分布式系统的项目经验,当场给他把分布式事务掰扯清楚

ShardingSphere面试题 客户端层负责接收应用程序的数据库请求,中间层是 ShardingSphere 的核心组件,负责路由、分片、事务协调等功能,数据源层包含多个数据库实例,用于存储和处理数据。在分布式事务中,ShardingSphere 会协调各个参与者数据库的事务,包括提交、回滚和异常处理。分库分表是将数据库中的数据按照某个规则分散存储在不同的数据库实例或表中的过程。ShardingSphere 的读写分离是通过配置数据源和路由规则来实现的。不同的分片策略适用于不同的场景,可以根据需求选择合适的策略。 阅读详情

分布式事务

为什么需要分布式事务

随着互联网的快速发展,业务越来越复杂,一个完整的业务往往需要调用多个子服务,涉及的数据也越来越多。传统的系统难以支撑,就出现了分布式系统,而分布式系统又带来了数据一致性的问题,从而产生了分布式事务。

什么叫分布式事务

分布式条件下,多个节点操作的整体事务一致性。

特别是在微服务场景下,业务A和业务B关联,如果事务A成功了,事务B失败了。由于跨系统,事务B无法通知到事务A,就造成了数据的不一致。

如何实现分布式下的一致性

  1. 强一致性

    1. XA
  2. 弱一致性

    1. 不用事务,业务侧补偿冲正
    2. 柔性事务,使用一套事务框架保证最终一致性的事务。
一、强一致性事务

1. XA分布式事务

在学习XA之前,我们先了解一下DTP模型,该模型规范了分布式事务的模型设计

  • 应用程序(Application Program):定义事务边界(即事务的开始和结束),并且在事务边界内对资源进行操作
  • 资源管理器(Resource Manager):如数据库、文件系统等。并提供访问资源的方式
  • 事务管理器(Transaction Manager):负责分配事务唯一标识,监控事务的执行进度,并负责事务的提交、回滚等。

XA协议 是由 X/Open 组织提出的,作为资源管理器与事务管理器的接口标准.目前Oracle、DB2、MySQL的InnoDB存储引擎都对XA进行了支持。XA接口提供资源管理器与事务管理器之间进行通信的标准接口。XA协议包括两套函数,以xa_开头的及以ax_开头的。

  • xa_start:负责开启或者恢复一个事务分支
  • xa_end:负责取消当前线程和事务分支的关联
  • xa_prepare:询问RM是否准备好提交事务分支
  • xa_commit:通知RM提交事务分支
  • xa_rollback:通知RM回滚事务分支
  • xa_recover:列出所有prepare的XA事务

MySQL 从5.0.3开始支持 InnoDB 引擎的 XA 分布式事务,MySQL Connector/J 从5.0.0版本开始支持 XA

MySQL XA事务状态

完整的XA事务流程

XA事务异常情况

  1. 业务SQL执行期间,某个RM崩溃怎么处理?

答:通知回滚。
2. 全部prepare后,某个RM崩溃怎么处理?

答:5.7以前崩溃的那个RM会丢失事务,导致别人都提交了,他被回滚了。5.7之后修复了,重连后还能继续提交。

  1. commit时,某个RM崩溃了怎么办?

答:RM恢复之后重试,要是重试还是失败就要发送告警,人工进行干预。

XA协议存在的问题

  1. 同步阻塞问题

全局事务内部包含了多个独立的事务分支,这一组事务分支,这一组事务分支要不都成功,要不都失败。各个事务分支的ACID特性构成了全局事务的ACID特性。那么mysql的效率也会降低
2. 单点故障

TM是单点的,一旦TM发生故障,参与者RM会一直阻塞下去。尤其再第二阶段,TM发生故障,那么所有的RM都还处于锁定资源的状态中,而无法完成事务操作。成熟的XA框架需要考虑TM的高可用性。

  1. 数据不一致

在提交阶段的时候,TM向RM发送commit请求后,发生了局部网络异常或者在发送commit请求的时候TM故障了,会导致部分RM收到commit请求并执行,而部分RM未收到commit请求则无法进行事务提交,就会造成数据不一致的情况。

支持XA的框架

XA方面的框架,比较推荐Atomikos和narayana

二、柔性事务

如果将实现了ACID的事务要素的事务称为刚性事务的话,那么基于BASE理论的事务则称为柔性事务。

BASE:

  • Basically Available (基本可用)
  • Soft state(柔性状态) 允许系统状态更新有一定的延时
  • Eventually consistent(最终一致性)

柔性事务常见模式

1. TCC

TCC模式将每个服务的业务操作分为两个阶段。第一个阶段检查并预留相关资源(Try),第二个阶段根据Try状态,如果都成功,则进行Comfirm操作,如果任意一个发生错误,则全部Cancel。

  1. Try:完成所有业务检查,预留资源
  2. Confirm:正在执行的业务逻辑,不做业务检查,只是要Try阶段预留的业务资源。因此,只要Try成功,Confirm基本能成功。另外Confirm需要满足幂等性。
  3. Cancel:释放Try阶段的资源。同样Cancel也需要满足幂等性。

TCC不依赖RM对分布式事务的支持,而是通过对业务逻辑的分解来实现分布式事务。对业务有侵入性

TCC需要注意的问题:

  1. 允许空回滚

Cancel的时候要判断Try有没有完成,没完成就不做Cancel
2. 防悬挂控制

如果网络等数据库还没收到Try的执行命令,Cancel命令先收到了。就会导致这个Try命令就没有相对于的Cancel操作了,会一直悬挂在那里。

解决方法:

  • 可以控制Try和Cancel的顺序,让Try在前面
  • 先收到Cancel的时候,记录一下。再收到Try的时候就知道这个操作是要取消的,那Try就没必要执行了。
  1. 幂等设计

commit操作可能会被重试,所以需要幂等性。

2. SAGA

Saga模式没有Try阶段,直接提交事务。复杂情况下,对回滚操作的设计要求较高。

3. AT

AT就是通过自动生成反向SQL的方式进行回滚。

在第一阶段的时候执行业务SQL,并且将SQL造成的影响保留下来。

第二阶段如果发生异常,就会通过保留的影响用反向SQL恢复回去。

缺点:生成反向SQL如果是在特别复杂的情况下,可能会处理不了。

4. 可靠消息最终一致性

  1. 服务A发送一个prepared消息给mq,如果发送失败则取消操作
  2. 消息发送成功则开始执行本地事务
  3. 本地事务执行成功就向mq发送确认消息,执行失败就发送回滚消息
  4. 如果mq没有接收到确认消息,mq会去轮询未确认的prepared消息,然后去查询服务A是否执行成功,然后确定是重试还是回滚
  5. 如果mq成功收到确认消息,那么他会被服务B消费到,并且服务B可以通过ACK机制保证服务B执行成功.
  6. 如果服务B实在是无法执行成功,可以通知服务A回滚,或者发送报警消息让手工补偿.

5. 本地消息表

  1. 服务A执行业务代码,并往自己的消息表插入一条数据
  2. 服务A执行成功后,会向MQ发送一条数据,去调用服务B的方法
  3. 服务B收到后,先往自己的消息表插入一条数据,然后去执行业务代码
  4. 如果服务B业务代码执行成功,那么更新自己的消息表的状态并且通知服务A更新消息表状态
  5. 如果服务B业务代码执行失败,那么服务B不用做什么
  6. 服务A会有一个定时任务定时轮询自己的消息表,将失败的消息再发给MQ,让服务B重新在执行一次(服务B保证接口幂等性)
  7. 通过不断的重试,保证最终一致性

这个方案大量使用来消息表,对于高并发的场景不太友好.

6. 最大努力型通知

类似银行的支付回调,会多次回调直到成功。

这种方案适用于允许有些事务失败的情况,如记录日志等.

三、分布式事务框架

1. Seata

Seata是阿里巴巴和蚂蚁金服联合打造的分布式事务框架。其AT事务的目标是让开发者像使用本地事务一样使用分布式事务。

核心组件:

  • TM 事务管理者:开启提交或回滚全局事务
  • TC 事务协调者:维护全局和分支事务的状态,指示全局提交或回滚。
  • RM 资源管理者:管理执行分支事务上的资源,向TC注册分支事务、上报分支事务状态、控制分支事务的提交或回滚。

Seata管理的分布式事务的典型声明周期:

  • TM要求TC开始一个全新的全局事务。
  • TC生成一个代表该全局事务的XID。XID贯穿整个微服务的调用链。
  • TM要求TC提交或回滚XID对应的全局事务。
  • TC驱动XID对应的全局事务下的所有分支事务完成提交或回滚。

Seata支持 XA、TCC、Saga模式,但支持的主要方式是 AT。

2. ShardingSphere对分布式事务的支持

ShardingSphere 通过整合常用的几个事务开源实现,如Atomkkos、Narayana,为本地事务、两阶段事务和柔性事务提供统一的分布式事务接口,并弥补当前方案的不足,提供一站式的分布式事务解决方案是ShardingSphere的设计目标。

面试:ShardingSphere问题 ShardingSphere 是一套开源的分布式数据库中间件解决方案组成的生态圈,主要由 JDBC、Proxy 组成。这两个产品均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。ShardingSphere是一个功能强大的数据库中间件,可用于解决分布式数据库架构中的多种挑战,包括数据分片、读写分离、分布式事务、影子库、数据加密等,从而提高了系统的性能、扩展性和可用性。ShardingSphere 保留了非常多的功能扩展。 阅读详情

相关推荐

ShardingSphere分库分表教程,java后端开发面试题

???? 简介:Java领域优质创作者????、优快云哪吒公众号作者✌ 、Java架构师奋斗者???? ???? 扫描主页左侧二维码,加入群聊,一起学习、一起进步 ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? 目录 一、分库分表 二、分库分表的方式 1、垂直分表 2、垂直分库 3、水平分表 4、水平分库 三、分库分表带来的问题 1、学习成本问题 2、事务问题 3、跨节点join问题 4、跨节点的count、order by、group by以及聚合函数问题 5、数据迁移、容量规划、扩

m0_64205716的博客 3017

面试三连问:你这个数据量多大?分库分表怎么做?用的哪个组件?

点击上方蓝色“码猿技术专栏”,选择“设为星标”来源:cnblogs.com/cjsblog/p/13154158.html1. 概述1.1. ShardingSphere-JDBC1....

码猿技术专栏 2500

ShardingSphere面试题及参考答案(3万字长文)

ShardingSphere是Apache软件基金会下的开源项目,它是一个分布式数据库中间件,主要提供数据分片、分布式事务和数据库治理等核心功能。ShardingSphere的设计目标是帮助企业解决数据库水平扩展的难题,通过将数据和流量分散到多个数据库中,来提高系统的整体性能和可伸缩性。它支持SQL92标准,能够与现有的数据库生态系统无缝集成,包括但不限于MySQL、PostgreSQL、SQL Server和Oracle等。

大模型大数据攻城狮的专栏 1177

分布式与分库分表面试题汇总

目录一、分布式相关(一)基础概念(二)原则理解(三)算法(四)分布式事务实现方案(五)其他二、分库分表相关(一)ShardingSphere 相关(二)分库分表后的操作什么是分布式系统?什么是分布式事务?CAP 原则和 BASE 原则怎么理解?为什么 CAP 原则不能全部满足?说下 Raft 算法?说下 Paxos 算法?分布式事务有哪些常见的实现方案?如何基于本地消息表实现分布式事务?说下你对 Seata 的理解?有哪些分布式锁的实现方案?你了解哪些限流算法?说说什么是幂等性?什么是 ShardingSp

m0_57836225的博客 1630

达梦DM8整合Seata AT模式实战:手把手教你搞定分布式事务(含源码修改避坑)

本文详细介绍了达梦DM8数据库与Seata AT模式的深度整合实战,包括环境准备、架构设计、源码适配及分布式事务落地。通过独创性源码改造,解决了Seata官方对达梦数据库AT模式支持的限制,为国产数据库在微服务架构中的应用提供了可靠的事务保障。

weixin_30764771的博客 333

ArcGIS实战:手把手教你用DEM和灾害点数据,5步搞定地质灾害风险区划图

本文详细介绍了使用ArcGIS进行地质灾害风险评估的完整流程,从DEM和灾害点数据出发,通过五步标准化操作生成专业风险区划图。重点讲解了信息量模型的应用,帮助读者掌握GIS技术在地质灾害易发性评价中的实践方法,提升风险评估效率与准确性。

weixin_30696427的博客 426

分布式事务理论加实战

为什么需要分布式事务 随着互联网的快速发展,业务越来越复杂,一个完整的业务往往需要调用多个子服务,涉及的数据也越来越多。传统的系统难以支撑,就出现了分布式系统,而分布式系统又带来了数据一致性的问题,从而产生了分布式事务。 什么叫分布式事务 分布式条件下,多个节点操作的整体事务一致性。 特别是在微服务场景下,业务A和业务B关联,如果事务A成功了,事务B失败了。由于跨系统,事务B无法通知到事务A,就造成了数据的不一致。 如何实现分布式下的一致性 强一致性 XA 弱一致性 不

互联网架构小马的博客 327

Coze知识库搭建:智能化管理与高效检索实践

知识管理系统是现代企业信息资产管理的核心基础设施,其核心原理是通过结构化存储和智能检索技术实现知识的快速流转。在技术实现上,基于NLP的语义理解引擎和知识图谱构建是关键,能够显著提升检索准确率和知识关联性。以Coze平台为例,其针对中文场景优化的分词算法和多模态处理能力,可有效解决技术文档管理中的术语识别和格式兼容问题。这类系统在开发团队知识沉淀、新员工培训等场景中价值显著,特别是当集成RBAC权限模型和自动化备份策略后,既能保障信息安全,又能实现持续的知识迭代。通过合理配置同义词扩展和权重调整,可使搜索命

weixin_29041195的博客 262

线上问题——【面试题】Mybatis-plus 整合 ShardingSphere-JDBC,调用批量方法执行更新操作扫所有分表问题

记录下 ShardingSphere 整合 mybatis-plus 进行批量更新时扫所有分表问题的原因及解决方案。ShardingSphere 整合 mybatis-plus 与整合 mybatis 流程是一样的,一个是导入 mybatis 包,一个是导入 mybatis-plus 包,在介绍了 ShardingSphere 分布分表及整合 mybatis 的使用示例,这里就不在赘述整合使用过程了。

longool的博客 2615

微积分,用编程理解高数(python,C,C++)

很好理解,导数中,x是哪一点的导数,dx是精准度,y等于f(x)即函数。导数结果就是瞬时变化率。积分很好理解,a为下限,b为上限,y为函数,结果就是y=f(x)下a到b的面积。只要用定积分代入a=0,b=10(10s)y=x(1*x=1)就得到结果。F(x)为原函数,即微分后的函数是f(x)dx,微分前是F(x)一列车初始速度为10m/s,加速度为。才几十行代码,微积分也不是很难啊。,问速度达到20时车走了多少米。

linhhanpy的博客 1179

别再硬编码了!WinCC子画面动态加载的5种C脚本写法对比

本文深入解析WinCC子画面动态加载的5种C脚本实现方案,包括基础加载、路径动态解析、多语言切换、窗口自适应布局和混合架构交互。通过代码示例和场景分析,帮助开发者避免硬编码问题,提升工业自动化系统的交互效率和可维护性。特别推荐路径动态解析方案,有效解决项目路径管理的痛点。

weixin_29008691的博客 477

2023高级Java面试题(付部分答案)

消息队列的消息丢失-》在项目首次用到消息队列处理大量数据接收的时候,我们使用了消息队列来对消息解析和消息入库做了一个解藕的操作,但是运行一段时间后,发现了生产环境存在数据丢失的情况,我们紧急定位,联系了数据上层推送房,发现每次丢失的数据都是在迭代发布,也就是服务重启的时候,猜测是消息消费时,由于服务重启,导致消息丢失,而且也没有相应日志报错,a.基于数据库,b.redis,c.zookeeper,了解过redis实现的分布式锁,主要是setnx命令的排他特性,获取锁的操作关键词:同步,设置超时时间。

RitaFrancis的博客 425

【网络与爬虫 53】Scrapy-Prometheus实战指南:打造企业级爬虫监控体系的终极解决方案

本文深入探讨Scrapy-Prometheus集成技术,通过费曼学习法从监控痛点出发,详细讲解如何在Scrapy爬虫中集成Prometheus指标收集系统。涵盖从基础配置到企业级监控体系的完整实战指南,帮助开发者构建可观测性强、可维护性高的分布式爬虫监控平台,实现爬虫性能的精准监控和智能告警。

熵数实验室 1586

Apache ShardingSphere 技术面试情景剧

模拟一场20轮的技术面试,由面试官提问,两位应聘者分别回答:张小明(搞笑程序员,回答通俗易懂)和Kevin(专业Java架构师,回答深入专业)。最后进行技术总结。

joshua的博客 980

2、机器人控制技术:阻抗/导纳控制与强化学习的融合

本文探讨了阻抗/导纳控制与强化学习在机器人控制中的融合应用。阻抗/导纳控制广泛应用于外骨骼和跟踪控制,通过改进方案提升建模误差下的鲁棒性;强化学习则为解决维度灾难、实现最优交互提供了有效途径,尤其在大输入空间、连续时间系统、冗余机器人及鲁棒控制中表现突出。结合近似器与合理奖励设计,强化学习可在无模型情况下实现高效控制。未来,两者融合有望推动更智能、更安全的机器人系统发展。

ice55的博客 300

量化交易 米筐 案例:市值因子选股策略

案例:市值因子的选股策略 1.结果 获得超额收益 年化 49% 2. 从股票中选择市值小的股票 选定财务数据筛选 进行每日调仓(多因子选股调仓 周期频率会小一些) 3. 代码 估值有关指标 # 在沪深300股票中,选出市值比较小的10只股票 # 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context): # 沪深300组合 stocks = index_components('000300.XSHG') # 沪深3

廷益_飞鸟的博客 2313

“分布式”学习与项目总结

所谓“当局者迷,旁观者清”,当我迷惑于当前知识的时候,证明我正平行于或低于该知识平面高度去学习这些知识,结果只有一个——“混乱”。因为自身没有一个高层次的“纲”让自己清晰且逻辑地“收编”和“汇总”这些知识,也许“知识焦虑”就这么来的。在管理层面上,面对矩阵型组织架构上X轴(项目经理)与Y轴(职能经理)平面上的矛盾,我会通过高层次的“目标共性”来一致性项目经理和职能经理的共同目标,让“矛盾”转化“合...

weixin_34375233的博客 251

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

面试官: ShardingSphere 学一下吧

文章目录 [toc] 学习之前先了解下分库分表概念:https://spiritmark.blog.youkuaiyun.com/article/details/109524713 一、ShardingSphere简介 在数据库设计时候考虑垂直分库和垂直分表。随着数据库数据量增加,不要马上考虑做水平切分,首先考虑缓存处理,读写分离,使 用索引等等方式,如果这些方式不能根本解决问题了,再考虑做水平分库和水平分表。 分库分表导致的问题: 跨节点连接查询问题(分页、排序) 多数据源管理问题 Apache Shardi

程序员小刘 933

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

分布式系统实战经验

分布式系统开发和运维过程中,必须综合考虑系统的扩展性、高可用性、一致性和容错能力。通过合理的设计、工具使用和实战经验的积累,可以确保系统在应对大规模、高并发请求时,依然能够稳定、高效地运行。

七夜zippoe的博客 1799

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

个人面试总结

一、JVM 1、内存溢出和内存泄露 定义: 内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。 内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。 关系: 内存泄露 → 剩余内存不足 → 后续申请不到足够内存 →内存溢出。 内存泄露产

Mars_15的博客 1597

Seata分布式事务解决方案

介绍了分布式事务的基础概念和相关理论,详细讲解了seata分布式数据库解决方案的各种模型、处理流程、优缺点等。

mustard1995的博客 1592

ShardingSphere——柔性事务SEATA原理

Apache ShardingSphere集成了 SEATA 作为柔性事务的使用方案,本文主要介绍其实现ShardingSphere中柔性事务SEATA原理原理。帮助你更好的理解ShardingSphere原理。同时帮助大家更好的使用柔性事务SEATA原理。

庄小焱 1242

峰哥分享:分布式系统设计6大经验

考虑到分布式应用之间接口调用过程中有可能出现异常以及重试(HttpConnection在连接超时的情况下会出现调用2次)的情况,接口的调用需要实现幂等性。需要注意点:若批量处理过程中,业务处理比较占用CPU时,每处理100-1000条数据的时候,需sleep(10)来降低一下CPU的使用率。1、通过SLB的粘性访问应用,有状态的应用会因为Session不均衡导致应用服务性能不平均,导致部分用户访问较慢;使用批量处理模式,可以减少网络IO的交互、减少线程的上下切换,从而降低CPU使用率。

峰哥的专栏 1046
上一篇: 全网疯传:如何把SpringBoot的Jar包做成exe?网友:有点钢~
下一篇: 太强了!Github大佬从零实现一个操作系统内核(附源码)!毕设/项目经验不愁了~
Java技术那些事儿
博客等级 码龄5年 2306粉丝 2584原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值