Java面试题———分布式篇

news2024/9/20 12:35:46

目录

1、什么是分布式事务

2、什么是CAP理论

3、为什么分布式系统中无法同时AC

4、什么是BASE理论

5、分布式事务的解决方案有哪些

6、Seata的架构是什么

7、XA模式的工作流程是什么

8、AT模型的工作原理是什么

9、TCC模型的工作原理是什么


1、什么是分布式事务

在分布式系统中,一个业务因为跨越不同数据库或者跨越不同微服务而包含多个子事务,要求所有子事务同时成功或失败,这就是分布式事务。

比如一个电商系统的下单操作需要请求三个服务来完成,这三个服务分别是:订单服务,账户服务,库存服务。

当订单生成完毕以后,就需要分别请求账户服务和库存服务进行进行账户余额的扣减和库存扣减。

假设都扣减成功了,此时在执行下单的后续操作时出现了问题,那么订单数据库就进行事务回滚,订单生成失败,而账户余额和扣减则都扣减成功了。

这就出现了问题,而分布式事务就是解决上述这种不一致问题的。

产生分布式事务的原因主要有下面几种:

  • 跨库事务:一个应用某个功能需要操作多个库,不同的库中存储不同的业务数据

  • 跨服务事务:一个应用某个功能需要调用多个微服务进行实现,不同的微服务操作的是不同的数据库

2、什么是CAP理论

在分布式系统有三个指标,分别是一致性、可用性、分区容错性

  • 一致性(Consistency) : 分布式系统中的更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,不能存在中间状态

  • 可用性(Availability) : 分布式系统中提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果

  • 分区容错性(Partition tolerance) : 分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务

CAP定理是指这个三个指标最多可以同时满足两个

3、为什么分布式系统中无法同时AC

对于分布式系统而言,各节点之间一定会存在网络交互,首先网络存在延迟,其次无法100%确保网络的可用,因此可以认为分区网络故障不可避免。

在此条件下,如果要保证各节点的一致性,就必须在一个节点数据变更后同步给其他节点前,让客户等待,这就无法满足可用性

如果要保证各节点的可用性,就必须让各节点在接收到请求立即返回响应,那这个时候各节点可能还没有完成数据的统一,所以就违背了一致性

所以,在存在系统分区的场景下,可用性和一致性无法同时满足

4、什么是BASE理论

BASE是CAP理论的延伸,核心思想是即使无法做到强一致性,但应用可以采用适合的方式达到最终一致性。它的思想包含三方面:

  • Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。

  • Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。

  • Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

5、分布式事务的解决方案有哪些

分布式事物的解决方案有很多,常见的有2PC、TCC,还有可以使用MQ来做

方案一:2PC

2PC即两阶段提交,它是一种保证强一致性的处理方式。 主要将事务分为两个阶段:

  • 阶段一: 表决阶段,所有参与者都将本事务执行预提交,并将能否成功的信息反馈发给协调者。

  • 阶段二: 执行阶段,协调者根据所有参与者的反馈,通知所有参与者,步调一致地执行提交或者回滚。

方案二:TCC

TCC又称补偿事务,它是一种保证最终一致性的处理方式,一共有三个步骤:

  • Try:做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirm一起才能真正构成一个完整的业务逻辑

  • Confirm:做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm

  • Cancel:在业务执行错误需要回滚的状态下执行分支事务的业务取消,预留资源释放

方案三:MQ分布式事务

如果数据强一致性要求没那么高,可以采用消息中间件(MQ)实现事务最终一致。

在支付系统中,常常使用的分布式事务解决方案就是基于MQ实现的,它对数据强一致性要求没那么高,但要求数据最终一致即可。

例如:向借呗申请借钱,借呗审核通过后支付宝的余额才会增加,但借呗和支付宝有可能不是同一个系统,这时候就可以借助MQ完成分布式事务

流程如下所示:

1、找借呗借钱

2、借呗借钱审核通过,同步生成借款单

3、借款单生成后,向MQ发送消息,通知支付宝转账

4、支付宝读取MQ消息,并增加账户余额

上图最复杂的其实是如何保障2、3在同一个事务中执行(本地事务和MQ消息发送在同一个事务执行),借款结束后,借呗数据处理就完成了,接下来支付宝才能读到消息,然后执行余额增加,这才完成整个操作。如果中途操作发生异常,例如支付宝余额增加发生问题怎么办?此时需要人工解决,没有特别好的办法,但这种事故概率极低。

6、Seata的架构是什么

Seata事务管理中有三个重要的角色:

1、TC (Transaction Coordinator) -事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。

2、TM (Transaction Manager) -事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。

3、RM (Resource Manager) -资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

如下所示:

7、XA模式的工作流程是什么

xa模式整个工作流程图如下所示:

分为两个阶段:

1、RM一阶段的工作:① 注册分支事务到TC ② 执行分支业务sql但不提交 ③ 报告执行状态到TC

2、TC二阶段的工作:TC检测各分支事务执行状态 ①如果都成功,通知所有RM提交事务 ②如果有失败,通知所有RM回滚事务

3、RM二阶段的工作:接收TC指令,提交或回滚事务

xa模式牺牲了可用性,保证了强一致性

8、AT模型的工作原理是什么

at模式的整个工作流程图如下所示:

1、阶段一RM的工作:① 注册分支事务 ② 记录undo-log(数据快照)③ 执行业务sql并提交 ④报告事务状态

2、阶段二提交时RM的工作:删除undo-log即可

3、阶段二回滚时RM的工作:根据undo-log恢复数据到更新前

at模式牺牲了一致性,保证了可用性

9、TCC模型的工作原理是什么

TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:

1、Try:资源的检测和预留;

2、Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。

3、Cancel:预留资源释放,可以理解为try的反向操作。

Seata中的tcc模型的执行流程如下所示:

1、阶段一RM的工作:① 注册分支事务 ② 执行try操作预留资源 ④报告事务状态

2、阶段二提交时RM的工作:根据各分支事务的状态执行confirm或者cancel

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Aix 清理 iscsi 残留盘

目录 一、前提概要 二、解决方法 一、前提概要 Aix 环境下挂载 ISCSI 盘,需要结合 LVM 进行挂盘。这个过程比较复杂,在使用过程中极易出现残留。 本篇博客介绍的就是如何清理 Aix 下 ISCSI 的残留。 二、解决方法 主要步骤和需要执行的命令如下面的流…

ModuleNotFoundError: No module named ‘pywin32_bootstrap

ModuleNotFoundError: No module named ‘pywin32_bootstrap 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社…

Prompt Engineering 完整指南

Prompt Engineering 完整指南 Prompt Engineering 是与 AI 模型进行交互的关键技术,通过精心设计的指令(prompt)引导模型生成高质量的输出。本文将详细介绍 prompt 设计的最佳实践、基本原则以及高级技巧,帮助你在实际应用中最大化…

vscode添加宏定义

1 起因 在用vscode看项目代码时,如果源文件中的代码块被某个宏定义给包裹住了,则在vscode的默认配置下,不会高亮显示这块被包裹住的代码,如下图中229行开始的代码被STM32F40_41xxx所控制,没有高亮显示。 由于STM32F4…

SSH升级至9.8p1

此前写过一个有关升级ssh的帖子,当时的情况是ssh5.3p1 升级到 ssh8.0 p1 下面是链接:https://blog.csdn.net/zhurobert/article/details/103193205?spm1001.2014.3001.5501 此次升级的环境是CentOS-7.6.1810 ssh版本7.4p1 准备好升级包后上传至/home…

Ubuntu 下 NFS服务开启

NFS(Network File System,网络文件系统)是一种基于TCP/IP传输的网络文件系统协议,它允许网络中的计算机之间通过TCP/IP网络共享资源。简单来说NFS就是一个文件传输的协议,可以用来传输文件。 使用如下命令安装 NFS 服务…

怎样选择开放式耳机好?精选五大实力出众爆款安利!

开放式耳机通过空气传导技术传递声音,不需要插入耳道,这种设计不仅保护了耳朵,还确保了佩戴的稳定性和舒适性。与传统的入耳式耳机相比,开放式耳机有助于保持耳道清洁,并允许用户在享受音乐的同时保持对周围环境的警觉…

Ps:首选项 - 增效工具

Ps菜单:编辑/首选项 Edit/Preferences 快捷键:Ctrl K Photoshop 首选项中的“增效工具” Plugins选项卡允许用户管理 Photoshop 中的插件和扩展功能,通过调整这些设置,用户可以根据自己的需求来扩展 Photoshop 的功能&#xff0c…

前端post传入拿到数据,后端报null,并且能够添加或者编辑成功

检查conterller层注解接到实体类的注解是不是没加( RequestBody ) 后端: 前端: 那么就看注解,因为contrller层有个接值注解( RequestBody )

Why Does ChatGPT Fall Short in Providing Truthful Answers?

文章目录 题目摘要简介相关工作模型和数据集结果事实性背后的能力提高 QA 的事实性结论 题目 为什么 ChatGPT 无法提供真实的答案? 论文地址:https://arxiv.org/abs/2304.10513 摘要 ChatGPT 等大型语言模型的最新进展已显示出影响人类生活各个方面的巨大潜力。然而…

18.token刷新拦截器

问题 上一篇博客中提到使用redis来存用户的登录信息,解决了session不共享问题。 在拦截器中,重新设置了用户信息的有效期,保证只要用户一直请求就永不过期。但是并不是每个请求都会经过拦截器的(因为登录拦截器,不是…

多个文件上传

♥️作者:小宋1021 🤵‍♂️个人主页:小宋1021主页 ♥️坚持分析平时学习到的项目以及学习到的软件开发知识,和大家一起努力呀!!! 🎈🎈加油! 加油&#xff01…

【书生大模型实战营】LMDeploy 量化部署进阶实践

LMDeploy 量化部署进阶实践 【书生大模型实战营】LMDeploy 量化部署进阶实践任务环境将大模型封装为API接口服务以命令行形式连接API服务器以Gradio网页形式连接API服务器 LMDeploy Lite和InternLMkv cacheW4A16 模型量化和部署W4A16 量化 KV cacheKV cache 量化 LMDeploy与Int…

【JavaEE】MyBatis 实战指南:从 JDBC 到高效数据库操作的进阶教程

目录 MyBatis 操作数据库JDBC 操作⽰例回顾什么是MyBatis?MyBatis⼊⻔1. 准备⼯作2. 配置数据库连接字符串3. 写持久层代码4. 单元测试使用MyBatis可能遇到的问题 MyBatis的基础操作打印⽇志参数传递增(Insert)返回主键 删(Delete)改(Update)查(Select)起别名结果映射开启驼峰…

vue使用高德获取当前地区天气

1、收件箱 | 高德控制台 (amap.com) 首先打开高德开放平台注册一下 2、创建一个应用获取到key后面获取天气的时候 请求接口的时候会用到key 2.1.1 创建应用的时候注意类型选成天气 2.1.2 创建完成之后就点添加key 然后选择web服务就行 3、可以调取天气接口 天气查询-基础 API…

https握手过程详解

https握手过程详解 上一篇《HTTPS通讯全过程》中https握手过程实际上还有更多的细节,为什么会这样设计呢?是因为一开始将握手过程时,吧步骤说的太详细会导致更难理解惹。所以我就先在上一篇把部分细节忽略,把原来几步的过程先简化…

洛杉物理服务器怎么样?

洛杉矶作为美国科技和互联网的重要中心,物理服务器的质量通常非常高,可以提供卓越的性能、强大的安全性、多样的配置选项和专业的服务支持。以下是对洛杉物理服务器的详细介绍。 1. 优质的性能 稳定的网络连接:洛杉矶物理服务器位于先进的数据…

CASS11时空版 全新升级支持多版本CAD软件下载License使用

南方数码地形地籍成图软件CASS,经过二十余年的发展,市场和技术积累丰厚,用户遍及国内外测绘地理信息相关行业。软件销量和市场占有率持续领先,是业内应用广,服务优的软件品牌。 南方数码深刻理解信息化测绘的内…

合宙LuatOS生成毫秒级时间戳

合宙Luatos - os操作 os.time()生成时间戳的精度只能达到秒级,在很多联网应用中需要毫秒级的时间戳。 经查看LuatOS-SOC接口文档,发现了解决办法。 socket - 网络接口文档 通过文档,我们只要获取当前数,然后把毫秒数与os.time(…

【C语言】:字符和字符串中的字符比较

1.入门 当我们想要一个字符和字符串中的某个字符进行比较时,可以直接用“”进行比较。 为什么可以用“”? 因为字符是存放在常量区,字符变量的值是固定的,字符之间的比较,本质上是对字符的ASCII比较。ASCII_百度百科…