当前位置: 首页 > article >正文

微服务面试(分布式事务、注册中心、远程调用、服务保护)

1.分布式事务

分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:

  • 跨数据源的分布式事务
  • 跨服务的分布式事务
  • 综合情况

我们之前解决分布式事务问题是直接使用Seata框架的AT模式,但是解决分布式事务问题的方案远不止这一种。

1.1.CAP定理

解决分布式事务问题,需要一些分布式系统的基础知识作为理论指导,首先就是CAP定理

1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标:

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)
    它们的第一个字母分别是 C、A、P。Eric Brewer认为任何分布式系统架构方案都不可能同时满足这3个目标,这个结论就叫做 CAP 定理。
    为什么呢?
    在这里插入图片描述

1.1.1.一致性

Consistency(一致性):用户访问分布式系统中的任意节点,得到的数据必须一致
比如现在包含两个节点,其中的初始数据是一致的:
在这里插入图片描述
当我们修改其中一个节点的数据时,两者的数据产生了差异:
在这里插入图片描述
要想保住一致性,就必须实现node01 到 node02的数据 同步:
在这里插入图片描述

1.1.2.可用性

Availability (可用性):用户访问分布式系统时,读或写操作总能成功
只能读不能写,或者只能写不能读,或者两者都不能执行,就说明系统弱可用或不可用。

1.1.3.分区容错

Partition,就是分区,就是当分布式系统节点之间出现网络故障导致节点之间无法通信的情况:
在这里插入图片描述
如上图,node01和node02之间网关畅通,但是与node03之间网络断开。于是node03成为一个独立的网络分区;node01和node02在一个网络分区

Tolerance,就是容错,即便是系统出现网络分区,整个系统也要持续对外提供服务

1.1.4.矛盾

在分布式系统中,网络不能100%保证畅通,也就是说网络分区的情况一定会存在。而我们的系统必须要持续运行,对外提供服务。所以分区容错性(P)是硬性指标,所有分布式系统都要满足。而在设计分布式系统时要取舍的就是一致性(C)和可用性(A)了。

假如现在出现了网络分区,如图:
在这里插入图片描述
由于网络故障,当我们把数据写入node01时,可以与node02完成数据同步,但是无法同步给node03。现在有两种选择

  • 允许用户任意读写,保证可用性。但由于node03无法完成同步,就会出现数据不一致的情况。满足AP
  • 不允许用户写,可以读,直到网络恢复,分区消失。这样就确保了一致性,但牺牲了可用性。满足CP

可见,在分布式系统中,A和C之间只能满足一个

1.2.BASE理论

既然分布式系统要遵循CAP定理,那么问题来了,我到底是该牺牲一致性还是可用性呢?如果牺牲了一致性,出现数据不一致该怎么处理?
人们在总结系统设计经验时,最终得到了一些心得

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

以上就是BASE理论。

简单来说,BASE理论就是一种取舍的方案,不再追求完美,而是最终达成目标。因此解决分布式事务的思想也是这样,有两个方向

  • AP思想:各个子事务分别执行和提交,无需锁定数据。允许出现结果不一致,然后采用弥补措施恢复,实现最终一致即可。例如AT模式就是如此
  • CP思想:各个子事务执行后不要提交,而是等待彼此结果,然后同时提交或回滚。在这个过程中锁定资源,不允许其它人访问,数据处于不可用状态,但能保证一致性。例如XA模式

1.3.AT模式的脏写问题

我们先回顾一下AT模式的流程,AT模式也分为两个阶段:
在这里插入图片描述

第一阶段是记录数据快照,执行并提交事务

在这里插入图片描述
第二阶段根据阶段一的结果来判断:

  • 如果每一个分支事务都成功,则事务已经结束(因为阶段一已经提交),因此删除阶段一的快照即可
  • 如果有任意分支事务失败,则需要根据快照恢复到更新前数据。然后删除快照
    在这里插入图片描述
    这种模式在大多数情况下(99%)并不会有什么问题,不过在极端情况下,特别是多线程并发访问AT模式的分布式事务时,有可能出现脏写问题,如图:

在这里插入图片描述
解决思路就是引入了全局锁的概念。在释放DB锁之前,先拿到全局锁。避免同一时刻有另外一个事务来操作当前数据。(db锁的等待时长非常长,而事务2的全局锁的等待时长只有300毫秒,所以一般最后事务1一定会拿到全局锁和db锁,不会想回等待进入死锁)

在这里插入图片描述
具体可以参考官方文档:
https://seata.apache.org/zh-cn/docs/dev/mode/at-mode/

全局锁能够限制的是都被seata统一管理的,如果有一个操作不是seata提哦难过一管理的,是其他操作的,那么全局锁就会失效,需要人工介入

在这里插入图片描述

1.4.TCC模式

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

  • try:资源的检测和预留
  • confirm:完成资源操作业务;要求 try 成功 confirm 一定要能成功。
  • cancel:预留资源释放,可以理解为try的反向操作

1.4.1.流程分析

举例,一个扣减用户余额的业务。假设账户A原来余额是100,需要余额扣减30元。
阶段一( Try ):检查余额是否充足,如果充足则冻结金额增加30元,可用余额扣除30

初始余额:

在这里插入图片描述
余额充足,可以冻结

在这里插入图片描述
此时,总金额 = 冻结金额 + 可用金额,数量依然是100不变。事务直接提交无需等待其它事务

阶段二(Confirm):假如要提交(Confirm),之前可用金额已经扣减,并转移到冻结金额。因此可用金额不变,直接冻结金额扣减30即可:

在这里插入图片描述

此时,总金额 = 冻结金额 + 可用金额 = 0 + 70 = 70元

阶段二(Canncel):如果要回滚(Cancel),则释放之前冻结的金额,也就是冻结金额扣减30,可用余额增加30

在这里插入图片描述

在这里插入图片描述

1.4.2.事务悬挂和空回滚

假如一个分布式事务中包含两个分支事务,try阶段,一个分支成功执行,另一个分支事务阻塞

在这里插入图片描述
如果阻塞时间太长,可能导致全局事务超时而触发二阶段的cancel操作。两个分支事务都会执行cancel操作

在这里插入图片描述
要知道,其中一个分支是未执行try操作的,直接执行了cancel操作,反而会导致数据错误。因此,这种情况下,尽管cancel方法要执行,但其中不能做任何回滚操作,这就是空回滚

对于整个空回滚的分支事务将来try方法阻塞结束依然会执行。但是整个全局事务其实已经结束了,因此永远不会再有confirm或cancel,也就是说这个事务执行了一半,处于悬挂状态,这就是业务悬挂问题。

以上问题都需要我们在编写try、cancel方法时处理。

1.4.3.总结

TCC模式的每个阶段是做什么的?

  • Try:资源检查和预留
  • Confirm:业务执行和提交
  • Cancel:预留资源的释放

TCC的优点是什么?

  • 一阶段完成直接提交事务,释放数据库资源,性能好
  • 相比AT模型,无需生成快照,无需使用全局锁,性能最强
  • 不依赖数据库事务,而是依赖补偿操作,可以用于非事务型数据库

TCC的缺点是什么?

  • 有代码侵入,需要人为编写try、Confirm和Cancel接口,太麻烦
  • 软状态,事务是最终一致
  • 需要考虑Confirm和Cancel的失败情况,做好幂等处理、事务悬挂和空回滚处理

1.5. 最大努力通知

除了上述的两种方式,有些企业嫌弃上述的方案,实现起来过于麻烦,所以可能会使用最大努力通知
在这里插入图片描述

2.注册中心

2.1.环境隔离

企业实际开发中,往往会搭建多个运行环境,例如:

  • 开发环境
  • 测试环境
  • 预发布环境
  • 生产环境

这些不同环境之间的服务和数据之间需要隔离。
还有的企业中,会开发多个项目,共享nacos集群。此时,这些项目之间也需要把服务和数据隔离

因此,Nacos提供了基于namespace的环境隔离功能。具体的隔离层次如图所示:

在这里插入图片描述
说明:

  • Nacos中可以配置多个namespace,相互之间完全隔离。默认的namespace名为public
  • namespace下还可以继续分组,也就是group ,相互隔离。 默认的group是DEFAULT_GROUP
  • group之下就是服务和配置

2.1.1.创建namespace

nacos提供了一个默认的namespace,叫做public:

在这里插入图片描述
默认所有的服务和配置都属于这个namespace,当然我们也可以自己创建新的namespace

在这里插入图片描述
添加完成后,可以在页面看到我们新建的namespace,并且Nacos为我们自动生成了一个命名空间id

在这里插入图片描述
我们切换到配置列表页,你会发现dev这个命名空间下没有任何配置

在这里插入图片描述
因为之前我们添加的所有配置都在public下

在这里插入图片描述

2.1.2.微服务配置namespace

默认情况下,所有的微服务注册发现、配置管理都是走public这个命名空间。如果要指定命名空间则需要修改application.yml文件
比如,我们修改item-service服务的bootstrap.yml文件,添加服务发现配置,指定其namespace

在这里插入图片描述

spring:application:name: item-service # 服务名称profiles:active: devcloud:nacos:server-addr: 192.168.150.101 # nacos地址discovery: # 服务发现配置namespace: 8c468c63-b650-48da-a632-311c75e6d235 # 设置namespace,必须用id# 。。。略

启动item-service,查看服务列表,会发现item-service出现在dev下

在这里插入图片描述
其它服务则出现在public下:

在这里插入图片描述
此时访问http://localhost:8082/doc.html,基于swagger做测试:

切换前能够查看item的最新价格的

在这里插入图片描述

item的微服务使用了新的命名空间,但是cart的微服务使用的是default的命名空间,就会查询不到,所以查询的newPrice就会为空

在这里插入图片描述
会发现查询结果中缺少商品的最新价格信息。
我们查看服务运行日志:

在这里插入图片描述
会发现cart-service服务在远程调用item-service时,并没有找到可用的实例。这证明不同namespace之间确实是相互隔离的,不可访问

当我们把namespace切换回public,或者统一都是以dev时访问恢复正常。

2.2.分级模型

在一些大型应用中,同一个服务可以部署很多实例。而这些实例可能分布在全国各地的不同机房。由于存在地域差异,网络传输的速度会有很大不同,因此在做服务治理时需要区分不同机房的实例。

例如item-service,我们可以部署3个实例:

  • 127.0.0.1:8081
  • 127.0.0.1:8082
  • 127.0.0.1:8083

假如这些实例分布在不同机房,例如:

  • 127.0.0.1:8081,在上海机房
  • 127.0.0.1:8082,在上海机房
  • 127.0.0.1:8083,在杭州机房

Nacos中提供了集群(cluster)的概念,来对应不同机房。也就是说,一个服务(service)下可以有很多集群(cluster),而一个集群(cluster)中下又可以包含很多实例(instance)
如图:

在这里插入图片描述
因此,结合我们上一节学习的namespace命名空间的知识,任何一个微服务的实例在注册到Nacos时,都会生成以下几个信息,用来确认当前实例的身份,从外到内依次是

  • namespace:命名空间
  • group:分组
  • service:服务名
  • cluster:集群
  • instance:实例,包含ip和端口

这就是nacos中的服务分级模型。

在Nacos内部会有一个服务实例的注册表,是基于Map实现的,其结构与分级模型的对应关系如下:

在这里插入图片描述
查看nacos控制台,会发现默认情况下所有服务的集群都是default

在这里插入图片描述
如果我们要修改服务所在集群,只需要修改bootstrap.yml即可:

spring:cloud:nacos:discovery:cluster-name: BJ # 集群名称,自定义

我们修改item-service的bootstrap.yml,然后重新创建一个实例:
在这里插入图片描述

再次查看nacos:

在这里插入图片描述
发现8084这个新的实例确实属于BJ这个集群了。

相关文章:

微服务面试(分布式事务、注册中心、远程调用、服务保护)

1.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如: 跨数据源的分布式事务跨服务的分布式事务综合情况 我们之前解决分布式事务问题是直接使用Seata框架的AT模式,但是解决分布式事务…...

高性能MYSQL(三):性能剖析

一、性能剖析概述 (一)关于性能优化 1.什么是性能? 我们将性能定义为完成某件任务所需要的时间度量,换句话说,性能即响应时间,这是一个非常重要的原则。 我们通过任务和时间而不是资源来测量性能。数据…...

Go 语言中的 panic 详解

Go 语言中的 panic 详解 在 Go 语言中,panic 是一种用于处理​​不可恢复错误​​的机制。当程序遇到无法继续执行的严重错误时,会自动或手动触发 panic,终止当前函数的执行,并开始进行​​堆栈展开​​(stack unwind…...

mysql(十四)

目录 多表查询 1.准备工作 2--创建表格 3--插入数据 2.笛卡尔积查询 3.内连接查询 1--隐式内连接 格式 查询 2--显示内连接(Inner join .. on ) 格式 查询 4.外连接查询 1--左外连接查询(LEFT OUTER JOIN .. ON ) 格式 查询 2-- 右…...

工业物联网中的事件驱动采样架构及优化

论文标题 Event-Based Sampling Architecture and Optimization for Industrial Internet of Things 工业物联网中的事件驱动采样架构及优化 作者信息 Tejas Thosani Process Control Systems, Micron Technology Inc., Manassas, USA tthosanimicron.com Andres Prado Esp…...

基于 HT for Web 的轻量化 3D 数字孪生数据中心解决方案

一、技术架构:HT for Web 的核心能力 图扑软件自主研发的 HT for Web 是基于 HTML5 的 2D/3D 可视化引擎,核心技术特性包括: 跨平台渲染:采用 WebGL 技术,支持 PC、移动端浏览器直接访问,兼容主流操作系统…...

JavaScript 性能优化:从入门到实战

在当今快节奏的互联网时代,用户对网页和应用的加载速度与响应性能要求越来越高。JavaScript 作为网页交互的核心语言,其性能表现直接影响用户体验。本文将用简单易懂的语言,带你了解 JavaScript 性能优化的实用技巧,帮助你的代码跑…...

启动metastore时报错MetaException(message:Version information not found in metastore

把hdfs清空重新安装了一下&#xff0c;hive的mysql元数据库删除掉之后重建之后一直启动报错 metastore.RetryingHMSHandler (RetryingHMSHandler.java:<init>(83)) - HMSHandler Fatal error: MetaException(message:Version information not found in metastore.) 后来…...

Spring 中 @Value 注解多实例配置方案详解

引言 在使用 Spring 框架进行开发时&#xff0c;我们经常会使用 Value 注解来注入配置值。然而&#xff0c;当我们需要创建同一个类的多个实例&#xff0c;并且每个实例需要使用不同的配置值时&#xff0c;直接在类中使用 Value 注解就会遇到问题。本文将深入探讨这个问题&…...

MyBatisPlus(1):快速入门

我们知道&#xff0c;MyBatis是一个优秀的操作数据库的持久层框架&#xff08;优秀持久层框架——MyBatis&#xff09;&#xff0c;其基于底层的JDBC进行高度封装&#xff0c;极大的简化了开发。但是对于单表操作而言&#xff0c;我们需要重复地编写简单的CRUD语句。这其实是不…...

京东热点缓存探测系统JDhotkey架构剖析

热点探测使用场景 MySQL 中被频繁访问的数据 &#xff0c;如热门商品的主键 IdRedis 缓存中被密集访问的 Key&#xff0c;如热门商品的详情需要 get goods$Id恶意攻击或机器人爬虫的请求信息&#xff0c;如特定标识的 userId、机器 IP频繁被访问的接口地址&#xff0c;如获取用…...

多国金融市场数据对接指南(印度、印尼、韩国)

一、StockTV多国数据对接概述 StockTV提供统一的API接口规范对接全球金融市场数据&#xff0c;本文重点介绍印度&#xff08;国家ID:14&#xff09;、印尼&#xff08;国家ID:42&#xff09;、韩国&#xff08;国家ID:xx&#xff09;的股票市场对接方案。 共同特性 统一认证…...

【Elasticsearch】ILM(Index Lifecycle Management)策略详解

ILM&#xff08;Index Lifecycle Management&#xff09;策略详解 1.什么是 ILM 策略&#xff1f;2.ILM 解决的核心业务问题3.ILM 生命周期阶段3.1 Hot&#xff08;热阶段&#xff09;3.2 Warm&#xff08;温阶段&#xff09;3.3 Cold&#xff08;冷阶段&#xff09;3.4 Delete…...

linux 后记

Linux Server 下载一个Server的版本&#xff0c;就是那种只有命令行的 学会这个就可以去租一个aliyun服务器&#xff0c;挺便宜的 如果在aliyun买服务器的话就不用管镜像源 但是如果是自己的虚拟机就必须设置镜像源&#xff0c;上网搜索阿里的镜像源&#xff0c;然后手动输入&…...

【笔记】在 MSYS2 MINGW64 环境中安装构建工具链(CMake、GCC、Make)

&#x1f4dd; 在 MSYS2 MINGW64 环境中安装构建工具链&#xff08;CMake、GCC、Make&#xff09; ✅ 目标说明 记录在 MSYS2 的 MINGW64 工具链环境中&#xff0c;成功安装用于 C/C 构建的常用开发工具。 包括&#xff1a; GCC 编译器Make 构建系统CMake 跨平台构建工具基础开…...

PyTorch -TensorBoard的使用 (一)

设置环境 新建python文件 .py 安装Tensorboard 在终端进行安装 显示安装成功 两个logs&#xff0c;出现这种情况怎么解决 所有的logs文件删掉delete&#xff0c;重新运行 add_image 不满足要求 Opencv-numpy 安装Opencv add_image 用法示例 &#xff08;500&#xff0c;375&am…...

Redis最佳实践——性能优化技巧之数据结构选择

Redis在电商应用中的数据结构选择与性能优化技巧 一、电商核心场景与数据结构选型矩阵 应用场景推荐数据结构内存占用读写复杂度典型操作商品详情缓存Hash低O(1)HGETALL, HMSET购物车管理Hash中O(1)HINCRBY, HDEL用户会话管理Hash低O(1)HSETEX, HGET商品分类目录Sorted Set高O…...

网络安全方向在校生有哪些证书适合考取?

工作7年得出结论&#xff1a;网络安全&#xff0c;考任何证书都没有用&#xff0c;实力才是根本。我是2021年考的 CISSP&#xff0c;报了培训班&#xff0c;花了1万一千块钱&#xff0c;签的保障班还是服务班不记得了&#xff0c;大概意思就是你放心去考&#xff0c;考不过可以…...

从0开始学习R语言--Day14--贝叶斯统计与结构方程模型

贝叶斯统计 在很多时候&#xff0c;我们经常会看到在统计分析中出现很多反直觉的结论&#xff0c;比如假如有一种病&#xff0c;人群中的患病率为1%&#xff0c;患者真患病时&#xff0c;检测结果为阳性的概率是99%&#xff0c;如果没有&#xff0c;则检测结果为阳性的概率是5…...

02-BTC-密码学原理 对hash算法如果出现漏洞的思考

如果比特币中某个哈希函数的抗碰撞性出现了漏洞怎么办&#xff0c;怎么补救&#xff1f; 答&#xff1a;&#xff08;1&#xff09;攻击场景&#xff1a; 伪造交易&#xff1a;攻击者可构造两个不同的交易&#xff08;如正常交易和恶意双花交易&#xff09;具有相同的TxID&…...

[Python] 如何使用 Python 调用 Dify 工作流服务实现自动化翻译

在实际项目中,自动化工作流服务可以大大简化复杂任务的处理流程。本文将介绍如何通过 Python 脚本调用 Dify 提供的工作流 API,实现文本翻译的自动化操作。该流程包括设置 API 接口、构造请求体并处理返回结果。 一、背景介绍:什么是 Dify 工作流服务? Dify 是一款支持多种…...

分布式微服务系统架构第142集:全栈开发

加群联系作者vx&#xff1a;xiaoda0423 仓库地址&#xff1a;https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ https://github.com/webVueBlog/fastapi_plus https://webvueblog.github.io/JavaPlusDoc/ /*** 本地启动解决跨域问题* 打包发布请注释该类&#…...

PTA-根据已有类Worker,使用LinkedList编写一个WorkerList类,实现计算所有工人总工资的功能。

目录 1.问题描述 2.函数接口定义&#xff1a; 3.裁判测试程序样例&#xff1a; 4.输入和输出样例 输入样例&#xff1a; 输出样例&#xff1a; 5.实现代码 1.问题描述 Main类&#xff1a;在main方法中&#xff0c;调用constructWorkerList方法构建一个Worker对象链表…...

文档整合自动化

主要功能是按照JSON文件&#xff08;Sort.json&#xff09;中指定的顺序合并多个Word文档&#xff08;.docx&#xff09;&#xff0c;并清除文档中的所有超链接。最终输出合并后的文档名为"sorted_按章节顺序.docx"。 主要分为几个部分&#xff1a; 初始化配置 定…...

微软markitdown PDF/WORD/HTML文档转Markdown格式软件整合包下载

本次和大家分享另一个微软发布的非常热门的文件文档转Markdown格式文档的软件markitdown&#xff0c;软件可以将PDF&#xff0c;word&#xff0c;ppt&#xff0c;Excel等十几种格式文档转换为markdown格式文档&#xff0c;我基于当前最新0.1.2版本制作了免安装一键启动整合包。…...

科普:Linux `su` 切换用户后出现 `$` 提示符,如何排查和解决?

科普&#xff1a;Linux su 切换用户后出现 $ 提示符&#xff0c;如何排查和解决&#xff1f; 在 Linux 系统管理中&#xff0c;su&#xff08;Switch User&#xff09;命令用于切换用户身份。正常情况下&#xff0c;从 root 切换到普通用户时&#xff0c;提示符会从 # 变成 $&…...

BayesFlow:基于神经网络的摊销贝叶斯推断框架

贝叶斯推断为不确定性条件下的推理、复杂系统建模以及基于观测数据的预测提供了严谨且功能强大的理论框架。尽管贝叶斯建模在理论上具有优雅性&#xff0c;但在实际应用中经常面临显著的计算挑战&#xff1a;后验分布通常缺乏解析解&#xff0c;模型验证和比较需要进行重复的推…...

NodeJS全栈开发面试题讲解——P9性能优化(Node.js 高级)

✅ 9.1 Node.js 的性能瓶颈一般出在哪&#xff1f;如何排查&#xff1f; Node.js 单线程 异步模型&#xff0c;瓶颈常出现在&#xff1a; 阻塞操作&#xff08;如&#xff1a;同步 I/O、CPU 密集型计算&#xff09; 数据库慢查询 / 索引失效 外部接口慢响应 大量并发请求导…...

NVMe IP现状扫盲

SSD优势 与机械硬盘&#xff08;Hard Disk Driver, HDD&#xff09;相比&#xff0c;基于Flash的SSD具有更快的数据随机访问速度、更快的传输速率和更低的功耗优势&#xff0c;已经被广泛应用于各种计算领域和存储系统。SSD最初遵循为HDD设计的现有主机接口协议&#xff0c;例…...

5G-A时代与p2p

5G-A时代正在走来&#xff0c;那么对P2P的影响有多大。 5G-A作为5G向6G过渡的关键技术&#xff0c;将数据下载速率从千兆提升至万兆&#xff0c;上行速率从百兆提升至千兆&#xff0c;时延降至毫秒级。这种网络性能的跨越式提升&#xff0c;为P2P提供了更强大的底层支撑&#x…...