【面试题】-java分布式及微服务面试题汇总

2023-11-04

目录

1.CAP理论

2.BASE理论

3.接口的幂等性问题

4.消息中间件如何解决消息丢失问题

5.什么是分布式事务?分布式事务的类型有哪些?

6.分布式事务的解决方案有哪些?

7.Dubbo的服务请求失败怎么处理

10.Soa和微服务架构有哪些区别?

11.dubbo服务提供者,服务消费者需要配置哪些信息?

12.Dubbo有哪些负载均衡策略

13.Redis的持久化方式有哪些?各有何利弊?

14.aof文件过大怎么处理?

15.讲一下redis的事务

16.缓存雪崩是什么

17.如何避免缓存雪崩

18.缓存穿透是什么?如何避免?

19.zookeeper的原理

20.zookeeper有哪些应用场景

21.zookeeper的节点类型有哪些?有什么区别?

22.讲一下zookeeper的选举机制

23.zookeeper的节点数为什么只能为奇数个?

24.如何保证消息队列的高可用

25.如何保证消息不被重复消费(幂等性问题)

26.如何保证消息的消费顺序? 

27.如何解决消息队列的延时及过期失效问题?

28.消息队列满了怎么处理?当消息过度积压怎么处理?


1.CAP理论

任何分布式系统都无法同时满足一致性(consistency),可用性(availibity),分区容错性(partition tolerance)这三项,最多只可同时满足其中的两项.

看过一道京东的面试题:

请说一说用zookeeper做注册中心和Eureka做注册中心的不同之处.

可以从CAP的角度进行分析,zk做注册中心是满足CP的,spring cloud是满足AP的,具体的可以展开阐述.

2.BASE理论

BASE是 Basically Available (基本可用) Soft state(软状态) Eventually consistent(最终一致性)这几个单词的缩写,

是从CAP理论发展而来的,其核心思想是:即使无法做到强一致性,但每个应用都可以根据自身特点,采取适当的方式来使系统达到最终一致性.

3.接口的幂等性问题

幂等的意思是重复操作,接口的幂等性也就是接口被重复调用了,在前端不进行限制的情况下,同一个接口可能重复调用多次,为了避免类似重复下单的问题,可以通过以下几种方式来解决幂等性问题:

全局唯一ID,根据业务操作和内容生成全局唯一的ID,然后在执行操作前先判断是否已经存在该ID,如果不存在则将该ID进行持久化(存在数据库或者redis中),如果已经存在则证明该接口已经被调用过了.比如下单时可以生产一个流水号来作为该订单的唯一标识.

可以使用select+insert来进行判断,因为一般订单的ID都是唯一索引,在高并发场景下不推荐.

可以使用乐观锁解决,在表中可以添加一个version字段.

token机制,将token放在redis中.

4.消息中间件如何解决消息丢失问题

可以在消息发送者这里发送一个id,接收端收到消息后将该ID存储于DB中,然后可以通过判断DB是否存在该ID来确定消息是否成功发送.

当然现在的消息中间件都比较强大,已经考虑并完善了这块内容,所以你可以直接借助消息中间件提供的方法来解决.

比如rabbitMQ,提供了事务机制,你可以在消息发送前提交事务,如果发送失败会自动回滚.

// 开启事务
channel.txSelect
try {
    // 这里发送消息
} catch (Exception e) {
    channel.txRollback

    // 这里再次重发这条消息
}

// 提交事务
channel.txCommit

但这样会比较耗性能,所以更推荐的做法是使用rabbitmq提供的confirm机制.confirm机制是异步的,在消费者收到生产者发送的消息后会回调ack,如果消费者接收失败会回调nack接口.

要想真正做到万无一失,我们不仅需要对Message进行持久化,还需要对Exchange,Queue也进行持久化,而rabbitMQ提供了这些持久化机制,因此使用一款好的消息中间件就可以很好的解决消息丢失问题.

当然除了rabbitMQ,kafka也有相应的解决方案,就不细说了(主要是不会).

5.什么是分布式事务?分布式事务的类型有哪些?

涉及到多个数据库操作的事务即为分布式事务,目的是为保证分布式系统中的数据一致性.

分布式事务类型:

二阶段提交2PC:第一步请求阶段通过协调者来统计表决结果,第二步执行表决后的结果,如果表决的结果是提交,那就提交执行,否则不执行提交.缺点是同步阻塞,而且万一协调者挂了就无法保证ACID.

三阶段提交3PC:在2PC的第一步拆分成了2步并且引入了超时机制,解决了2PC的痛点.第一步先向参与者发出一个信号,看看大家是否都能提交,如果可以就返回yes,否则返回no.第二步PreCommit阶段,预提交一下,如果参与者可以完成commit,就返回ack进确认,如果不能则放弃提交本次事务.第三步doCommit阶段,进行真正的事务提交.

6.分布式事务的解决方案有哪些?

XA:XA是基于二阶段事务实现的一种标准协议,目前主流数据库都已支持该协议.由于是二阶段提交,缺点很明显,不适合高并发场景.

补偿机制TCC:try,commit,cancel的缩写,try阶段进行检测,commit提交执行,只要try阶段成功了commit就一定会被执行,cancel业务出现错误时执行,回滚事务,释放资源.

消息中间件MQ:可以通过阿里的消息中间件RocketMQ来进行解决.RocketMQ支持带事务的消息,具体思路大概是这样的:

第一步:消息生产者向消息集群发送prepared消息,获取消息地址.

第二步:本地提交事务,并向集群发送确认消息.

第三步:通过第一步获取到的地址,访问消息并改变消息状态.

 

7.Dubbo的服务请求失败怎么处理

Dubbo启动时有默认的重试机制和超时机制,如果服务在限定的请求时间内没有响应,则认为本次请求失败.

如果在配置的重试次数内,请求失败后dubbo会重新发送请求,如果超过请求失败的重试次数还没有请求成功,则认为本次请求失败,抛出异常.

8.Dubbo支持哪些协议?Dubbo的默认协议是什么?

Dubbo支持多种协议,比如dubbo,http,rmi,webservice,默认支持的协议是dubbo协议.

9.Dubbo和SpringCloud有哪些区别?

Dubbo是soa(面向服务的架构),SpringCloud是微服务架构.

Dubbo基于RPC(远程过程调用),SpringCloud是基于Restful,前者底层是tcp连接,后者是http,在大量请求的情况下,dubbo的响应时间要短于springcloud.

Dubbo的提供的功能要少于springcloud,springcloud提供了一整套的微服务治理方案,比如服务熔断,监控,追踪,配置中心等.

10.Soa和微服务架构有哪些区别?

微服务是在Soa的基础上发展而来,从粒度上来说,微服务的粒度要比SOA更细.

微服务由于粒度更细,所以微服务架构的耦合度相对于SOA架构的耦合度更低.

微服务的服务规模相较于SOA一般要更大,所能承载的并发量也更高.

11.dubbo服务提供者,服务消费者需要配置哪些信息?

提供者:需要配置IP,端口,协议.

消费者:注册中心的地址.

12.Dubbo有哪些负载均衡策略

一致性Hash均衡算法,轮询,随机调用,最少活动调用法.

13Redis支持哪些数据结构?分别有哪些应用场景?

Redis一共支持5种数据类型:String,List,Hash,set,sort set.

String常被用来存放字符串,get,set缓存.

List可以用来做列表.Hash用来放对象,比如用户的信息.sort set可以用来做排行榜

13.Redis的持久化方式有哪些?各有何利弊?

Redis的持久化有两种方式,AOF和RDB.

AOF:以独立日志记录写命令方式存储日志,重启时再重新执行日志中记录的数据即可完成恢复.优势是数据安全,不容易丢数据,而且aof中的内容可以读懂,如果不小心敲了flushall命令,还可以将aof文件尾部的flushall命令删掉,然后就可以恢复数据了.缺点是占用存储空间大,数据恢复较慢.

RDB:将内存中的数据以快照的方式写进二进制文件中.优势是数据恢复快,方便备份,缺点是比较耗内存,可能会造成数据丢失.

14.aof文件过大怎么处理?

可以重复执行aof命令,bgwriteaof,执行后会触发重写aof文件,会将aof中的重复命令进行压缩.

15.讲一下redis的事务

redis的事务先以MULTI开启事务,将多个命令入队到事务中,然后通过EXEC命令触发执行队伍中的所有命令,如果想取消事务可以执行discard命令.

16.缓存雪崩是什么

如果所有缓存数据设置的过期时间是相同的,那么所有缓存在同一时间内由于到期而失效,此时请求会全部进入数据库,这就是缓存雪崩.

17.如何避免缓存雪崩

可以对缓存的过期时间设置一个随机值,避免缓存在同一时间过期.

18.缓存穿透是什么?如何避免?

缓存穿透就是指在查询一个一定不存在的数据时,缓存会不命中,如果从数据库中查询不到则不放入缓存,则每次请求实际都会进数据库进行查询,失去了缓存的意义.

可以采用布隆过滤,也就是将数据库中所有可能存在的数据哈希放到一张足够大的bitmap中,一定不存在的数据就会被bitmap过滤掉,从而减轻数据库的压力.

19.zookeeper的原理

zab协议,zab协议有2种模式恢复模式(选主)和广播模式(同步),当服务启动或者主节点宕机后,zk会进入恢复模式,选出Master节点后就可以进行数据同步了.

20.zookeeper有哪些应用场景

zookeeper可以作为dubbo的注册中心,可以做分布式锁,可以做mycat的配置中心.

21.zookeeper的节点类型有哪些?有什么区别?

有临时节点和永久节点,分再细一点有临时有序/无序节点,有永久有序/无序节点.

当创建临时节点的程序结束后,临时节点会自动消失,临时节点上的数据也会一起消失.

22.讲一下zookeeper的选举机制

zookeeper的节点数必须为2n+1,也就是奇数个节点,以此来保证选举成功.

以5个节点的集群为例,每个zk都有自己的id,叫myid,这里假设我5台服务器zk的myid依次为1-5.

启动myid为1的zk,它会给自己投票,然后发现集群中无其他节点启动,于是它处于looking状态

启动myid为2的zk,它会给自己投票,然后与节点1互换投票,由于节点2的myid大于节点1,所以此次投票节点2胜出,但节点2此时的得票少于总节点数的一半,所以节点2不能被作为master,节点2也将处于looking状态

启动myid为3的zk,它会给自己投票,然后与节点1,2互换投票,由于节点3的myid大于节点2,所以此次投票节点3胜出,节点3的得票数大于节点总数的一半了,此时节点3胜出,成为master节点,其他两个节点成为slaver节点

启动myid为4的zk,尽管节点4的myid最大,但此时已经有主了,节点4也只能乖乖做一个从节点...

启动myid为5同上...

当有节点挂了之后,开始重新选举,选举规则跟上面类似.

23.zookeeper的节点数为什么只能为奇数个?

因为zookeeper的选举算法要求:可用节点数 > 总节点数/2 如果为奇数个节点的话,一旦zk集群发生均等脑裂,就无法保证该算法要求.

24.如何保证消息队列的高可用

可用采用集群来保证高可用,以RabbitMQ为例,推荐采用镜像集群,普通集群如果磁盘节点挂了就GG了,还是无法保证高可用,镜像集群的配置要用到HAProxy,需要在后台管理页面中设置策略,将ha-mode设置为all,表明每个节点上都存放镜像...限于篇幅,具体的集群配置我后面会专门写一篇博客总结.

25.如何保证消息不被重复消费(幂等性问题)

rabbitmq并没有提供防止消息重复消费的功能,只能在业务端去实现,如果业务是做了集群的,我们可以用redis帮助解决,具体做法是将消息的msgid和消费状态用redis存储起来,每次消费前先查看一下本次消费的消息状态,如果已经被消费过了,就可以不用消费.如果尚未消费,就可以进行消费,消费完把对应的状态改为已消费即可.

26.如何保证消息的消费顺序? 

以rabbitmq为例,消息1和消息2需要按顺序消费,必须先消费消息1,后消费消息2,我们可以将消息放顺序到不同的queue里,然后由worker来消费.

27.如何解决消息队列的延时及过期失效问题?

批量重导,自己写程序把失效的数据查出来然后重新导入队里中.

28.消息队列满了怎么处理?当消息过度积压怎么处理?

应当在设计上尽量避免出现这种问题,如果确实已经碰到了,可以采取服务降级策略,同时临时增加一些消费能力更强劲的消费者,以X倍速率消费队列中积压的消息.

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

【面试题】-java分布式及微服务面试题汇总 的相关文章

  • 宇宙第一TTS 微软ASZURE python api演示

    我是个追求品质的人 tts可用的一大堆 免费的也一大堆 但是微软的目前独步天下 而且近期tts网站似乎取消了白嫖机制 只能正经八百白买了 去TB搞一个使用账号 也不贵 一年40 简单的使用方法在此 当然 就是从微软文档抄的作业 目前已知可以

随机推荐

  • QT的UI界面效果预览快捷键

    QtCreator的界面预览 Shift Alt R 运行快捷键 Ctrl R 只构建快捷键 Ctrl B 怕忘了 自己记录一下
  • 西门子S7-200PLC温度程序 最近看到同行发的各种帮做程序

    西门子S7 200PLC温度程序 最近看到同行发的各种帮做程序 留言里总有初学者求温度 PID程序 所以我发出来给需要的人学习 适合初学者的模拟量温度处理程序 包含一份CAD图纸 一份PDF图纸 一套PLC程序 id 56733527955
  • 实训一 思科交换机基础配置

    交换机的命令行操作模式 用户模式 特权模式 全局配置模式 端口模式 1 命令行操作模式的进入 用户模式switch gt 输入enable 进入特权模式switch 输入configure terminal 进入全局配置模式switch c
  • 双节点文件服务器,在 Windows Server 2008 中配置双节点文件服务器故障转移群集的循序渐进指南.doc...

    在 Windows Server 2008 中配置双节点文件服务器故障转移群集的循序渐进指南 在 Windows Server 2008 中配置双节点文件服务器故障转移群集的循序渐进指南 更新时间 2007年4月 应用到 Windows S
  • win7系统下利用VS Code断点调试C/C++源码

    1 系统配置 win7 64系统 2 VS Code版本 1 70 2 System setup 3 安装包下载官网 Visual Studio Code July 2022 由于计算机是win7版的 故选择能支持win7系统版本的VS C
  • Rancher和K8s关系

    产品介绍 K8s Kubernetes 为企业提供了一种一致的方式来管理任何计算基础架构 百度百科 Rancher则是用于管理位于任何位置的Kubernetes集群的完整平台 如果用户是自己手动部署K8s集群 流程还是比较复杂的 需要掌握一
  • Idea中打包jar包(mavan项目)

    一 操作环境 IntelliJ IDEA 2020 3 3 Win10 Mavan项目 二 操作 1 确保打包方式为jar 打开pom xml文件 找到
  • MAC搜索不到蓝牙设备解决方案

    简单的解决方案就是 在打开的窗口中找到 com apple Bluetooth plist 删掉 如果还看到 com apple Bluetooth plist lockfile 也一并删 如下图 然后重启 也可以参考 http bbs p
  • [Unity][安卓]Unity和Android Studio 3.0 交互通讯(1)Android Studio 3.0 设置

    安卓 Android Studio 3 0 JDK安卓环境配置 2017 10 http blog csdn net bulademian article details 78387052 安卓 Android Studio 3 0 安装包
  • 计算机中丢失dasfj_v1.2.dll,S7DasBrMenu.dll(修复丢失S7DasBrMenu.dll文件)V1.0 正式版

    S7DasBrMenu dll 修复丢失S7DasBrMenu dll文件 是针对S7DasBrMenu dll文件的一款很好用的修复工具 使用电脑时遇到S7DasBrMenu dll文件丢失怎么办 没关系 小编带来的这款S7DasBrMe
  • 深入理解设计原则之KISS/YAGNI/DRY原则【软件架构设计】

    系列文章目录 C 高性能优化编程系列 软件架构设计系列 深入理解设计模式系列 高级C 并发线程编程 如果敌人使你生气 说明你没有胜过他的信心 If the enemy makes you angry that means you have
  • js 判断字符串中是否包含某个字符串

    可通过str includes 和str indexOf 1 includes 语法 arr includes searchElement arr includes searchElement fromIndex 参数说明 参数 描述 se
  • 数据结构-线性结构之线性表

    什么是线性表 线性表 Linear List 由同类型数据元素构成的有序序列的线性结构 1 表中元素个数称为线性表的长度 2 线性表没有元素时 称为空表 3 表起始位置称为表头 表的结束位置称为表尾 线性表的抽象数据类型描述 类型名称 线性
  • 使用maven 打成可提供给第三方使用的jar包

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 1 集成环境idea 2 目标第三方可直接引入使用 步骤如下 0 组件项目打包一定要把build 元素注释掉 否则别人无法引入 jar包 pom 例子如下
  • Django笔记总结

    1 web框架的本质 web通信流程 web我们这里指的就是通过浏览器去访问服务端 请求页面或者数据的通信方式 属于B S架构 就是我们常见的网站 浏览器与服务端的通信流程 浏览器客户端发送一个请求信息 数据 发送到我们服务端 服务端接受这
  • 使用强随机数

    伪随机数易被攻击者破解而找到其数序生成规律 伪随机数不能用于安全敏感应用 常见安全敏感应用 SessionID的生成 挑战算法中的随机数生成 验证码的随机数生成 生成重要随机文件的文件名 生成密钥相关的随机数等 对于安全敏感应用 应该使用强
  • H3C交换机堆叠(IRF)

    目录 1 IRF简介 1 1 实验环境 1 2 添加交换机 1 3 添加连接线 1 4 启动设备 1 5 修改设备名称 1 6 关闭IRF物理端口 1 7 设置IRF域编号 1 8 设置member成员编号 1 9 配置IRF端口并与物理端
  • 使用ESP8266和Blynk应用程序的远程房间恒温器

    该项目可通过您的手机通过家庭WiFi或移动网络的任何地方控制您的家庭供暖单元 基本上 它可以用远程控制器代替普通的可编程房间恒温器 作为遥控器 它使用安装了Blynk App并配置为可以满足所有需求的智能手机 智能手机和供暖系统之间的通信由
  • Android 9(P)应用进程创建流程大揭秘

    Android 9 P 应用进程创建流程大揭秘 Android 9 P 系统启动及进程创建源码分析目录 Android 9 P 之init进程启动源码分析指南之一 Android 9 P 之init进程启动源码分析指南之二 Android
  • 【面试题】-java分布式及微服务面试题汇总

    目录 1 CAP理论 2 BASE理论 3 接口的幂等性问题 4 消息中间件如何解决消息丢失问题 5 什么是分布式事务 分布式事务的类型有哪些 6 分布式事务的解决方案有哪些 7 Dubbo的服务请求失败怎么处理 10 Soa和微服务架构有