【Java面试】十、微服务篇-分布式(下)

文章目录

  • 1、分布式系统
  • 2、CAP定理
  • 3、Base理论
  • 4、分布式事务的解决方案:Seata
    • 4.1 Seata的XA模式
    • 4.2 Seata的AT模式
    • 4.3 Seata的TCC模式
  • 5、分布式事务的解决方案:MQ
  • 6、分布式系统下,接口的幂等性
    • 6.1 数据库唯一索引
    • 6.2 token + redis
    • 6.3 分布式锁
  • 7、分布式任务调度xxl-job
    • 7.1 路由策略
    • 7.2 任务执行失败的处理
    • 7.3 大数据量任务同时执行--分片广播
  • 8、面试

1、分布式系统

简单说就是:一个活儿可以被多个人处理(一个请求过来,有多个节点都有能力处理它并响应),因此,需要考虑数据的一致性

在这里插入图片描述

分布式系统中的多个节点,可以是多台物理机、多台虚拟机、多个容器。分布式系统的引入,提高了系统的:

  • 可伸缩性(业务高峰期多起几个实例放节点上)
  • 可靠性(多个节点可以干活儿,挂掉一台服务器也问题不大)
  • 性能(并发能力变为n倍,n为节点数)

在这里插入图片描述
最后,加节点,是多了个干活儿的人,提到的是并发上限,单个接口,响应该几秒还是几秒,因为处理某个接口的这个活儿,你交给哪个人去干,都是那个耗时。

2、CAP定理

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

CAP定理即:布式系统无法同时满足这三个指标

在这里插入图片描述

一致性,即用户访问分布式系统的任意节点,得到的数据必须一致。一个活儿,多个人都可以处理,但你问甲的结果和问乙的结果必须一样

在这里插入图片描述

可用性,即用户访问集群中的任意健康节点,必须得到响应,不能超时或者拒绝。

在这里插入图片描述

分区容错,即集群出现分区时,整个系统也要持续对外提供服务。

分区容错性,背景是:因网络故障或其他原因,导致分布式系统的部分节点和其他节点失去了联系,形成了独立分区

在这里插入图片描述
此时,客户端往节点node02写入数据v1,而node02只能同步给node01,node03数据还是旧的,违背了一致性。反之,如果想要数据一致,那就让分区2的节点node03别干活儿了,penging到网络恢复,但这违背了可用性。

结论:

  • 分布式系统节点之间肯定是需要网络连接的,分区(P)是必然存在的,因此,而分区一旦出现,如上分析,一致性和可用性就不可能同时满足。因此,CA是不可能的
  • 如果保证访问的高可用性A,可以持续对外提供服务,但不能保证数据的强一致性 ⇒ AP
  • 如果保证访问的数据强一致性C,就要放弃高可用性 ⇒ CP

3、Base理论

要么追求CP,要么追求AP,但也不是非0即1。追求了CP,仍然有数据的一致性,不过不再是强一致性,而是最终一致罢了。⇒ Base理论:

  • Basically Available(基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用
  • Soft state(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态
  • Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致

在这里插入图片描述

以上面的下单业务为例,下单后,需要做订单数据生成、账户扣款、库存余量维护。数据分布在不同的节点上,需要跨越多个节点或服务进行数据操作和事务处理(分布式事务)。此时就有两种选择:

  • 最终一致:各个分支事务(订单服务、账户服务、库存服务各自对应一个分支事务)分别执行并提交,如果哪一个分支事务执行失败,则需要恢复其他已提交的分支事务的数据(之前insert的就delete)。如此,数据最终一致,但会出现一个临时状态,也就是Base理论里所说的软状态,即数据不一致,订单服务库里有订单数据,但库存服务的库里数据未减少。 ⇒ AP
  • 强一致:各个分支事务执行完后不要提交,等待彼此的结果,统一提交或回滚,如此,数据强一致,但分支事务等待其他分支时,处于弱可用状态 ⇒ CP

4、分布式事务的解决方案:Seata

微服务架构下,多个微服务之间,只是做查询,那没啥好提事务的,但只要一个业务发生了多个微服务的写操作,如上面说的下单,就要进行分布式事务控制。解决方案:

  • Seata
  • MQ

Seata架构:
在这里插入图片描述

包括三个角色:

  • TC(Transaction Coordinator):事务协调者,维护全局和分支事务的状态,协调全局事务提交或回滚
  • TM (Transaction Manager): 事务管理器,定义全局事务的范围、开始全局事务、提交或回滚全局事务
  • RM(Resource Manager):资源管理器,可以认为是每一个微服务的节点,他们分别对应一个分支事务

4.1 Seata的XA模式

分支事务各自执行业务SQL后,不提交分支事务,等待TC检查各个分支事务,如果各个分支事务的SQL执行都没报错,则通知分支事务一起提交事务,反之,通知各个分支事务一起回滚事务。体现的是CP,即保证的是数据强一致性

在这里插入图片描述

XA模式缺陷是:各个分支事务之间要等待,等待期间,有资源锁定(业务SQL执行对应的数据被锁定,其他线程无法访问)

4.2 Seata的AT模式

和XA不同,AT模式下,各个分支事务会执行SQL并提交事务,但同时每个分支事务也都记录了undo-log日志。提交事务后,各个分支事务向TC报告自己的事务状态到TC,即告诉TC,自己的SQL执行成功没有,都成功,则删除undo-log日志,有一个失败,则根据undo-log把其余分支事务的数据退回去。

在这里插入图片描述
AT模式,体现的是AP,只要最终一致性,不要强一致

4.3 Seata的TCC模式

TCC模式即,Try、Confirm、cancel。比如还是下单,买本书100元,订单服务对应的分支事务A,进行Try资源预留,即检查下你的余额有没有 > 100,有则冻结100块。库存服务对应的分支事务B,进行Try资源预留,即检查库存剩余数量是否 > 1。Try后,各个分支事务向TC报告事务状态,如果都成功,则进行Confirm,提交全局事务。反之,执行Cancel,释放预留资源。

在这里插入图片描述
缺点是Try的部分得自己代码实现。

5、分布式事务的解决方案:MQ

比如向借呗申请借钱,借呗系统资质审核通过后,支付宝系统余额才能增加。但借呗和支付宝在两个不同的系统,还不是一个系统的两个微服务。此时,可用MQ实现:

在这里插入图片描述

用户申请借钱,资质审核通过后,借呗系统落库借款单并给MQ发消息(这两步,借呗在自己的库里加事务去控制同成功、同失败)。支付宝系统监听MQ,消费,给对应的用户增加余额。这样,数据的强一致性最弱,也即"5分钟内到账"。

最后,分布式事务各个方案的使用场景:

在这里插入图片描述

6、分布式系统下,接口的幂等性

幂等性:即多次调用一个接口,和单次调用一个接口,结果都一致,不会改变业务状态。 需要考虑幂等的场景如:用户重复点击(网络波动)。Restful API下的接口:

在这里插入图片描述
PUT不一定幂等:

//幂等
update t item set money= 500 where id = 1;

//不幂等
update t item set money = money + 500 where id = 1;

关于接口幂等性的实现方式:

在这里插入图片描述

6.1 数据库唯一索引

确保列或列组合的数值唯一性的索引,如此,插入数据时,多次调用就会报错:

在这里插入图片描述
这样只能处理新增的幂等性,修改的幂等性无法保证

6.2 token + redis

  • 第一次请求,生成一个唯一 token 存入redis ,返回给前端
  • 第二次请求,业务处理,携带之前的token,到redis 进行验证,如果存在,可以执行业务,删除token。如果不存在,则直接返回,不处理业务
    在这里插入图片描述

6.3 分布式锁

如下,防止重复支付,用支付ID作为分布式锁的key,防止某一笔订单被重复支付

在这里插入图片描述

7、分布式任务调度xxl-job

xxl-job的优势:

  • 解决集群任务的重复执行问题
  • cron 表达式定义灵活,不再硬编码到代码中
  • 定时任务失败了,重试和统计
  • 任务量大,分片执行

7.1 路由策略

每个任务交给哪个节点(或者job服务的哪个pod)去干:

在这里插入图片描述

  • First:固定选择第一个实例
  • Last:固定选择最后一个实例
  • Round:轮询
  • Random:随机
  • Least_Frequently_Used:最不经常使用的,使用频率最低的
  • Least_Recently_Used:最近最久未使用,最久没被使用的
  • FailOver:故障转移,按心跳检测,第一个心跳检测成功的
  • BusyOver:忙碌转移,按空闲检测,第一个空闲检测成功的
  • Sharding_Broadcast:分片广播

7.2 任务执行失败的处理

设置路由策略为故障转移 + 设置失败重试次数

在这里插入图片描述

重试后也可能失败,此时可查看日志,

在这里插入图片描述

以及设置邮件告警:页面上配置的是运维的邮箱

在这里插入图片描述

最后,部署xxl-job时,要配置下邮件发送者的信息,比如公司邮箱

在这里插入图片描述

7.3 大数据量任务同时执行–分片广播

分片广播的路由策略下,将一个任务分片执行并发到多个执行器上
在这里插入图片描述

在任务执行的代码中可以获取分片总数和当前分片,按照取模的方式分摊到各个实例执行:

在这里插入图片描述

8、面试

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离

MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 原文:MATLAB和物联网连载1:Internet of Things离你有多远?5行MATLAB的距离 - 知乎 (zhihu.com) 来自俄罗斯的实习生在工作之余喜欢上网看点有的没的。有一天他突然发现了一个神奇的网站叫 T…

HTTP --tcp和keep-alive

TCP TCP连接 tcp/ip是全球计算机以及网络设备都在使用的一种常见的分组交换网络分层协议集,客户端可以打开一条tcp/ip连接,连接到可能运行在世界各地的服务器应用程序,一旦连接建立起来了,在客户端和服务器的计算机之间交换的报…

IntelliJ IDEA配置创建文件后自动生成注释字段,包括作者、日期和描述等信息。

效果 新建文件自动生成如下文档注释 配置如下: 打开setting 进行如下操作 粘贴的模板内容如下: /*** author developer_ZhangXinHua* date ${YEAR}/${MONTH}/${DAY}* desc ${DESCRIPTION}*/

Nios II 实现流水灯实验

Nios II 实现流水灯实验 一.硬件设计1.新建Quartus项目2. 设计Nios ii 二.软件设计 前言 实验目标: 学习 Quartus 、Platform Designer、Nios-II SBT 的基本操作;初步了解 SOPC 的开发流程,基本掌握 Nios-II 软核的定制方法;掌握 …

期权交易要怎么计算盈亏?期权盈亏平衡点是什么?

今天带你了解期权交易要怎么计算盈亏?期权盈亏平衡点是什么?期权盈利和亏损的计算公式取决于具体的交易策略和期权类型。 期权交易要怎么计算盈亏? 期权买方盈亏计算: 对于期权买方(无论是认购期权还是认沽期权&…

逻辑门(与门、或门、非门、异或门)

一、实验目的 了解DE1-SOC开发板一些外设。 掌握常用组合逻辑门电路的基本原理。 学习Verilog HDL的基本语法。 学习使用ModelSim工具对设计的电路进行仿真,包括编写Testbench仿真代码,以及ModelSim工具的使用。 熟悉使用Quartus软件从创建Quartus工…

什么是Swagger UI ,swagger ui 的authorization怎么获取?

什么是Swagger UI Swagger UI 是一个用于可视化和交互式地展示API文档的工具。它是Swagger(现称为OpenAPI)生态系统的一部分,旨在帮助开发者和API用户更好地理解、测试和调试API。 主要功能和作用 1. API文档自动生成: Swagge…

【Java高级教程】集合部分

参考链接 一、 Java 数据结构 二、 Java 集合框架 三 Java ArrayList 四 Java LinkedList 五 Java HashSet 六 Java HashMap 七 Java Iterator(迭代器) 八 Java Object 类 ava Object 类是所有类的父类,也就是说 Java 的所有类都继承了 Obj…

常用ai模型和一些术语的科普

本文是早年浏览easyai.tech后留下的笔记。 文章目录 神经网络CNNRNNGANKNNCPU和GPU/TPUNLPNo free lunch theoremtransformer注意力机制自动编码器,自编码器GNN推荐系统附录NFL的两个例子 神经网络 水流,水龙头,流量阀。 可以回想CNN分类MNI…

StretchSense:将手部动作无缝集成到Xsens全身动捕系统中

在动画制作中逼真的手部动作可以大幅提升角色的情感表现能力,这将使观众更加轻易的走进角色,感受角色的情感变化并更加快速的了解角色的性格特点。如性格外向的角色将拥有更加复杂的手部动作表达。因此有效加强角色的手部动画真实度有助于吸引更多的观众…

基于Java+Vue智慧社区管理系统设计和实现(源码+LW+调试文档+讲解等)

💗博主介绍:✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者,博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 🌟文末获取源码数据库🌟 感兴趣的可以先收藏起来,还…

22-验证码的处理

验证码这种问题是比较头疼的,对于验证码的处理,不要去想破解方法,这个验证码本来就是为了防止别人自动化登录的。 目前最快速解决的三个手段: 去掉验证码:比较适合新开发但未上线的系统。设置万能码:比较适…

【GD32】06 - SPI (含ST7735S TFT-LCD屏幕驱动)

这篇文章我们看看GD32中如何实现SPI,软件SPI的话可以参考我之前的文章,把对应操作GPIO口的代码从STM32改成GD32就可以使用了。 【快速上手STM32】SPI通信协议&&1.8寸TFT-LCD(ST7735S)_tftlcdst7735和stm32-CSDN博客文章浏…

docker部署skywalking

skywalking版本下载 1:拉取skywalking的oap镜像(可以选择自己的版本,最好与ui,agent版本一致) docker pull apache/skywalking-oap-server:9.5.02:启动oap docker run -d -p 11800:11800 -p 12800:12800 --name sw_oap apache/…

HCIE数通,为啥是网工的“黄金标准”?

作为网络工程师,你不可能没听说过HCIE,也不可能没听过数通,也可能曾经考虑过要不要挑战这个认证。 HCIE数通为何被誉为网工的黄金标准?聊聊 01 什么是HCIE数通? HCIE数通认证是华为技术有限公司推出的一项高级别认证…

深度学习-05-反向传播理论知识

深度学习-05-反向传播理论知识 本文是《深度学习入门2-自製框架》 的学习笔记,记录自己学习心得,以及对重点知识的理解。如果内容对你有帮助,请支持正版,去购买正版书籍,支持正版书籍不仅是尊重作者的辛勤劳动&#xf…

使用 IPSET 添加 CDN 节点 IP(IPv4/IPv6)到防火墙白名单

明月的服务器一直使用的是 iptables,随着近几年 IPv6 的普及,明月切身体会到还是 IPSET 最方便了,无论你是 IPv4 还是 IPv6 都可以方便的管理,无论你是加入白名单还是黑名单,都非常的简单高效!今天就参照明月自己的实操…

PyQt5串口测试工具

笔者经常会遇到使用上位机进行相关测试的场景,但现成的上位机并不能完全满足自己的需求,或是上位机缺乏使用说明。所以,自己写? 环境说明 pycharm 2023.2.25 python 3.10 anaconda 环境配置 conda create -n envsram ##…

Proxmox Backup Server 命名空间使用

作者:田逸(formyz) Proxmox Backup Server(一下统称PBS)从2.2版本开始,新增了命名空间这样一个功能。这个功能大大便利了多Proxmox VE集群或者单节点备份,在以前PBS版本中,如果有多个…

Windows系统下DOS命令

Windows系统下DOS命令 1. 与文件操作相关1.1 mkdir,md命令1.2 rmdir、rd命令1.3 dir命令1.4 start命令1.5 echo命令1.6 type命令1.7 copy命令1.8 move命令1.9 copy和move的区别1.10 del命令1.11 rename命令1.12 attrib命令1.13 fsutil命令1.14 assoc命令 2. 与网络相…