2021大厂Java面试真题(分布式

1、分布式服务接口的幂等性如何设计?

所谓幂等性,就是说一个接口,多次发起同一个请求,你这个接口得保证结果是准确得。

比如不能多扣款。不能多插入一条数据,不能将统计值多加了 1,这就是幂等性。

其实保证幂等性主要是三点:

  • 对于每个请求必须有一个唯一的标识,举个例子:订单支付请求,肯定得包含订单 ID,

一个订单 ID 最多支付一次。

  • 每次处理完请求之后,必须有一个记录标识这个请求处理过了,比如说常见得方案是再

mysql 中记录个状态啥得,比如支付之前记录一条这个订单得支付流水,而且支付流水采

用 order id 作为唯一键(unique key)。只有成功插入这个支付流水,才可以执行实际

得支付扣款

  • 每次接收请求需要进行判断之前是否处理过得逻辑处理,比如说,如果有一个订单已经支

付了,就已经有了一条支付流水,那么如果重复发送这个请求,则此时先插入支付流水,

order id 已经存在了,唯一键约束生效,报错插入不进去得。然后你就不用再扣款了。

2、分布式系统中的接口调用如何保证顺序性?

可以接入 MQ,如果是系统 A 使用多线程处理的话,可以使用内存队列,来保证顺序性,

如果你要 100%的顺序性,当然可以使用分布式锁来搞,会影响系统的并发性。

**3、**说说 ZooKeeper 一般都有哪些使用场景?

  • 分布式协调:这个其实就是 zk 很经典的一个用法,简单来说,就好比,你系统 A 发送

个请求到 mq,然后 B 消费了之后处理。那 A 系统如何指导 B 系统的处理结果?用

zk 就可以实现分布式系统之间的协调工作。A 系统发送请求之后可以在 zk 上对某个节

点的值注册个监听器,一旦 B 系统处理完了就修改 zk 那个节点的值,A 立马就可以收

到通知,完美解决。

  • 分布所锁:对某一个数据联系发出两个修改操作,两台机器同时收到请求,但是只能一台

机器先执行另外一个机器再执行,那么此时就可以使用 zk 分布式锁,一个机器接收到了

请求之后先获取 zk 上的一把分布式锁,就是可以去创建一个 znode,接着执行操作,

然后另外一个机器也尝试去创建那个 znode,结果发现自己创建不了,因为被别人创建

了,那只能等着,等等一个机器执行完了自己再执行。

  • 配置信息管理:zk 可以用作很多系统的配置信息的管理,比如 kafka,storm 等等很多

分布式系统都会选用 zk 来做一些元数据,配置信息的管理,包括 dubbo 注册中心不也

支持 zk 么。

  • HA 高可用性:这个应该是很常见的,比如 hdfs,yarn 等很多大数据系统,都选择基于

zk 来开发 HA 高可用机制,就是一个重要进程一般会主备两个,主进程挂了立马通过

zk 感知到切换到备份进程。

**4、**说说你们的分布式 session 方案是啥?怎么做的?

  • Tomcat + redis

其实还挺方便的,就是使用 session 的代码跟以前一样,还是基于 tomcat 原生的

session 支持即可,然后就是用一个叫做 tomcat RedisSessionManager 的东西,让我们

部署的 tomcat 都将 session 数据存储到 redis 即可.

  • Spring Session + redis

分布式会话的这个东西重耦合在 tomcat,如果我要将 web 容器迁移成 jetty,不能重新

把 jetty 都配置一遍.

所以现在比较好用的还是基于 java 的一站式解决方案,使用 spring session 是一个很

好的选择,给 spring session 配置基于 redis 来存储 session 数据,然后配置一个 spring

session 的过滤器,这样的话,session 相关操作都会交给 spring session 来管了。接着在

代码中,就是用原生的 session 操作,就是直接基于 spring session 从 redis 中获取数据

了。

**5、**分布式事务了解吗?

  • XA 方案/两阶段提交方案

第一个阶段(先询问

第二个阶段(再执行

  • TCC 方案

TCC 的全程是:Try、Confirm、Cancel

这个其实是用到了补偿的概念,分为了三个阶段

Try 阶段:这个阶段说的是对各个服务的资源做检测以及对资源进行锁定或者预留

Confirm 阶段:这个阶段说的是在各个服务中执行实际的操作

Cancel 阶段:如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,就是

执行已经成功的业务逻辑的回滚操作

  • 本地消息表

  • 可靠消息最终一致性方案

  • 最大努力通知方案

6、那常见的分布式锁有哪些解决方案?

  • Reids 的分布式锁,很多大公司会基于 Reidis 做扩展开发

  • 基于 Zookeeper

  • 基于数据库,比如 Mysql

7、ZK 和 Redis 的区别,各自有什么优缺点?

先说 Redis:

  • Redis 只保证最终一致性,副本间的数据复制是异步进行(Set 是写,Get 是读,Reids

集群一般是读写分离架构,存在主从同步延迟情况),主从切换之后可能有部分数据没有

复制过去可能会丢失锁情况,故强一致性要求的业务不推荐使用 Reids,推荐使用 zk。

  • Redis 集群各方法的响应时间均为最低。随着并发量和业务数量的提升其响应时间会有明

显上升(公有集群影响因素偏大),但是极限 qps 可以达到最大且基本无异常

再说 ZK:

  • 使用 ZooKeeper 集群,锁原理是使用 ZooKeeper 的临时节点,临时节点的生命周期

在 Client 与集群的 Session 结束时结束。因此如果某个 Client 节点存在网络问题,与

ZooKeeper 集群断开连接,Session 超时同样会导致锁被错误的释放(导致被其他线程

错误地持有),因此 ZooKeeper 也无法保证完全一致。

  • ZK 具有较好的稳定性;响应时间抖动很小,没有出现异常。但是随着并发量和业务数量

的提升其响应时间和 qps 会明显下降。

8、MySQL 如何做分布式锁?

方法一:

利用 Mysql 的锁表,创建一张表,设置一个 UNIQUE KEY 这个 KEY 就是要锁的 KEY,

所以同一个 KEY 在 mysql 表里只能插入一次了,这样对锁的竞争就交给了数据库,处理同

一个 KEY 数据库保证了只有一个节点能插入成功,其他节点都会插入失败。

DB 分布式锁的实现:通过主键 id 的唯一性进行加锁,说白了就是加锁的形式是向一张

表中插入一条数据,该条数据的 id 就是一把分布式锁,例如当一次请求插入了一条 id 为 1

的数据,其他想要进行插入数据的并发请求必须等第一次请求执行完成后删除这条 id 为 1

的数据才能继续插入,实现了分布式锁的功能。

方法二:

使用流水号+时间戳做幂等操作,可以看作是一个不会释放的锁。

9、你了解业界哪些大公司的分布式锁框架

  • Google:Chubby

Chubby 是一套分布式协调系统,内部使用 Paxos 协调 Master 与 Replicas。

Chubby lock service 被应用在 GFS, BigTable 等项目中,其首要设计目标是高可靠性,

而不是高性能。

Chubby 被作为粗粒度锁使用,例如被用于选主。持有锁的时间跨度一般为小时或天,而

不是秒级。

Chubby 对外提供类似于文件系统的 API,在 Chubby 创建文件路径即加锁操作。

Chubby 使用 Delay 和 SequenceNumber 来优化锁机制。Delay 保证客户端异常释放锁

时,Chubby 仍认为该客户端一直持有锁。Sequence number 指锁的持有者向 Chubby 服

务端请求一个序号(包括几个属性),然后之后在需要使用锁的时候将该序号一并发给

Chubby 服务器,服务端检查序号的合法性,包括 number 是否有效等。

  • 京东 SharkLock

SharkLock 是基于 Redis 实现的分布式锁。锁的排他性由 SETNX 原语实现,使用

timeout 与续租机制实现锁的强制释放。

  • 蚂蚁金服 SOFAJRaft-RheaKV 分布式锁

RheaKV 是基于 SOFAJRaft 和 RocksDB 实现的嵌入式、分布式、高可用、强一致的

KV 存储类库。

RheaKV 对外提供 lock 接口,为了优化数据的读写,按不同的存储类型,提供不同的锁

特性。RheaKV 提供 wathcdog 调度器来控制锁的自动续租机制,避免锁在任务完成前提前

释放,和锁永不释放造成死锁。

  • Netflix: Curator

Curator 是 ZooKeeper 的客户端封装,其分布式锁的实现完全由 ZooKeeper 完成。

在 ZooKeeper 创建 EPHEMERAL_SEQUENTIAL 节点视为加锁,节点的

EPHEMERAL 特性保证了锁持有者与 ZooKeeper 断开时强制释放锁;节点的

SEQUENTIAL 特性避免了加锁较多时的惊群效应。

10、请讲一下你对 CAP 理论的理解

在理论计算机科学中,CAP 定理(CAP theorem),又被称作布鲁尔定理(Brewer’s

theorem),它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

  • Consistency(一致性)

指数据在多个副本之间能够保持一致的特性(严格的一致性)

  • Availability(可用性) 指系统提供的服务必须一直处于可用的状态,每次请求都能获取

到非错的响应(不保证获取的数据为最新数据)

  • Partition tolerance(分区容错性)分布式系统在遇到任何网络分区故障的时候,仍然能

够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障

Spring Cloud 在 CAP 法则上主要满足的是 A 和 P 法则,Dubbo 和 Zookeeper 在

CAP 法则主要满足的是 C 和 P 法则。

CAP 仅适用于原子读写的 NOSQL 场景中,并不适合数据库系统。现在的分布式系统具

有更多特性比如扩展性、可用性等等,在进行系统设计和开发时,我们不应该仅仅局限在

CAP 问题上。

现实生活中,大部分人解释这一定律时,常常简单的表述为:“一致性、可用性、分区容

忍性三者你只能同时达到其中两个,不可能同时达到”。实际上这是一个非常具有误导性质的

说法,而且在 CAP 理论诞生 12 年之后,CAP 之父也在 2012 年重写了之前的论文。

当发生网络分区的时候,如果我们要继续服务,那么强一致性和可用性只能 2 选 1。也

就是说当网络分区之后 P 是前提,决定了 P 之后才有 C 和 A 的选择。也就是说分区容错

性(Partition tolerance)我们是必须要实现的。

11、请讲一下你对 BASE 理论的理解

BASE 理论由 eBay 架构师 Dan Pritchett 提出,在 2008 年上被分表为论文,并且

eBay 给出了他们在实践中总结的基于 BASE 理论的一套新的分布式事务解决方案。

BASE 是 Basically Available(基本可用) 、Soft-state(软状态) 和 Eventually

Consistent(最终一致性) 三个短语的缩写。BASE 理论是对 CAP 中一致性和可用性权衡

的结果,其来源于对大规模互联网系统分布式实践的总结,是基于 CAP 定理逐步演化而来的,

它大大降低了我们对系统的要求。

BASE 理论的核心思想是即使无法做到强一致性,但每个应用都可以根据自身业务特点,

采用适当的方式来使系统达到最终一致性。也就是牺牲数据的一致性来满足系统的高可用性,

系统中一部分数据不可用或者不一致时,仍需要保持系统整体“主要可用”。

针对数据库领域,BASE 思想的主要实现是对业务数据进行拆分,让不同的数据分布在不

同的机器上,以提升系统的可用性,当前主要有以下两种做法:

  • 按功能划分数据库

  • 分片(如开源的 Mycat、Amoeba 等)。

12、分布式与集群的区别是什么?

分布式: 一个业务分拆多个子业务,部署在不同的服务器上

集群: 同一个业务,部署在多个服务器上。比如之前做电商网站搭的 redis 集群以及

solr 集群都是属于将 redis 服务器提供的缓存服务以及 solr 服务器提供的搜索服务部署在

多个服务器上以提高系统性能、并发量解决海量存储问题。

13、请讲一下 BASE 理论的三要素

基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性。但是,这绝

不等价于系统不可用。

比如:

  • 响应时间上的损失:正常情况下,一个在线搜索引擎需要在 0.5 秒之内返回给用户相应

的查询结果,但由于出现故障,查询结果的响应时间增加了 1~2 秒

  • 系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能

够顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激

增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面

软状态

软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体

可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。

最终一致性

强调的是系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状

态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统

数据的强一致性。

14、请说一下对两阶段提交协议的理解

分布式系统的一个难点是如何保证架构下多个节点在进行事务性操作的时候保持一致性。

为实现这个目的,二阶段提交算法的成立基于以下假设:

  • 该分布式系统中,存在一个节点作为协调者(Coordinator),其他节点作为参与者

(Cohorts)。且节点之间可以进行网络通信。

  • 所有节点都采用预写式日志,且日志被写入后即被保持在可靠的存储设备上,即使节点损

坏不会导致日志数据的消失。

  • 所有节点不会永久性损坏,即使损坏后仍然可以恢复。

第一阶段(投票阶段)

协调者节点向所有参与者节点询问是否可以执行提交操作(vote),并开始等待各参与者节

点的响应。

  • 参与者节点执行询问发起为止的所有事务操作,并将 Undo 信息和 Redo 信息写入日志。

(注意:若成功这里其实每个参与者已经执行了事务操作)

  • 各参与者节点响应协调者节点发起的询问。如果参与者节点的事务操作实际执行成功,则

它返回一个”同意”消息;如果参与者节点的事务操作实际执行失败,则它返回一个”中

止”消息。

第二阶段(提交执行阶段)

当协调者节点从所有参与者节点获得的相应消息都为”同意”:

  • 协调者节点向所有参与者节点发出”正式提交(commit)”的请求。

  • 参与者节点正式完成操作,并释放在整个事务期间内占用的资源。

  • 参与者节点向协调者节点发送”完成”消息。

  • 协调者节点受到所有参与者节点反馈的”完成”消息后,完成事务。

如果任一参与者节点在第一阶段返回的响应消息为”中止”:

  • 协调者节点向所有参与者节点发出”回滚操作(rollback)”的请求。

  • 参与者节点利用之前写入的 Undo 信息执行回滚,并释放在整个事务期间内占用的资源。

  • 参与者节点向协调者节点发送”回滚完成”消息。

  • 协调者节点受到所有参与者节点反馈的”回滚完成”消息后,取消事务。

15、请讲一下对 TCC 协议的理解

Try Confirm Cancel

  • Try:尝试待执行的业务 ,这个过程并未执行业务,只是完成所有业务的一致性检查,并

预留好执行所需的全部资源。

  • Confirm:执行业务,这个过程真正开始执行业务,由于 Try 阶段已经完成了一致性检查,

因此本过程直接执行,而不做任何检查。并且在执行的过程中,会使用到 Try 阶段预留

的业务资源。

  • Cancel:取消执行的业务,若业务执行失败,则进入 Cancel 阶段,它会释放所有占用

的业务资源,并回滚 Confirm 阶段执行的操作。

2021大厂Java面试真题(分布式 )相关推荐

  1. 2021大厂Java面试真题(六)

    2021大厂Java面试真题(六) * * 2021 [华为]面试真题* * : * * 1.Java 常用集合及特点?* * List:ArrayList.LinkedList.Vector.Sta ...

  2. 2021大厂Java面试真题(一)

    2021大厂Java面试真题(一) 大厂面试的基本流程 以下是一些大厂面试的基本流程,大家可以参考下: 字节跳动 阿里 腾讯 网易游戏 面试前需要准备: \1. **Java 八股文:**了解常考的题 ...

  3. 2021大厂Java面试真题(二)

    2021大厂Java面试真题(二) 2021 [阿里]面试真题: 1.TCP 和 UDP 区别? TCP 基于连接,UDP 基于无连接. TCP 要求系统资源较多,UDP 较少. UDP 程序结构较简 ...

  4. 2021大厂Java面试真题集锦,深度解析,值得收藏

    第一个:Alibaba[搜索推荐] 一面:算法题:长度为n的数组里放了n+1个大小在[1,n]的数,必然至少有一个重复的数,找出来 二面:概率题:求一根绳子被切两刀能组成一个三角形的概率. 三面主管面 ...

  5. “烤面经了“~2022最新大厂Java面试真题总结,可带劲了

    前言 疫情到现在已经持续有3年的时间了,由于疫情的影响,无数行业都受到了影响,互联网寒冬下,许多程序员被裁,大环境格外困难. 我发现一个奇怪的现象:那些跳槽的人,总是从一个坑,跳进令一个坑中.毕竟一年 ...

  6. 秋招如何抱佛脚?2022最新大厂Java面试真题合集(附权威答案)

    2022秋招眼看着就要来了,但是离谱的是,很多同学最近才想起来还有秋招这回事,所以纷纷临时抱佛脚,问我有没有什么快速磨枪的方法, 我的回答是:有! 说起来,临阵磨枪没有比背八股文更靠谱的了,很多人对这 ...

  7. 金三银四如何抱佛脚?2022 最新大厂 Java 面试真题合集(附权威答案)

    这些面试资料都是我通过各种渠道收集到的大厂面试真题,并附有最新的权威答案,绝不是网络上那些已经是几年前甚至十几年前的面试题所能媲美的,除面试题外还有我整理的一些经典 Java 学习电子书也都可以无偿分 ...

  8. 2021京东Java面试真题:杭州java工资

    第一家是美团 美团的话,三面下来,设计的内容知识也是挺广的吧,有MySQL.Redis.Kafka.线程.算法.+.volatile.线程.并发.设计模式等等- 一面问题:MySQL+Redis+Ka ...

  9. 2021京东Java面试真题:javadouble四舍五入取整

    前言 正值金九银十面试旺季,现在的面试官一天少说得看几百份简历,你投出去的简历如果没有特别吸引人的点和新颖突出,毫无疑问你的简历不是在垃圾桶就是在回收站里边待着了,那么什么样的简历才能吸引到面试官的眼 ...

  10. SpringBoot整合Elasticsearch,2021最新Java面试真题解析

    @Field(type = FieldType.Keyword) private String categroy; @Field(type = FieldType.Double) private Do ...

最新文章

  1. 与技术无关的书单--你可以笑着说有些是“精神鸦片”
  2. 灰度发布系统架构设计
  3. 微信翻译生日快乐的代码_微信「隐藏彩蛋」,你发现了没?
  4. 大数据测试之hadoop命令大全 2
  5. 已经人均5G了?5G手机没人买,iPhone 11没5G该不该被嘲讽?
  6. JQuery——实现Ajax应用
  7. SSL加速卡调研的原因及背景
  8. vim编辑时遇到E325: ATTENTION Found a swap file by the name ./.backu.sh.swp错误代码的解决办法
  9. ngrok实现内网穿透
  10. Jasper报表导出pdf中文不显示——Font simsun is not available to the JVM. See the Javadoc for more det,已解决
  11. Excel常用的功能
  12. 计算机操作技能节,第十届知识技能节 网线制作竞赛方案
  13. 台式计算机电源线 规格,电脑电源线规格的介绍
  14. vue3 + crypto-js加密解密(普通版本/TS版本)
  15. BI工具和数据中台有什么区别?
  16. C语言中的类型限定符有哪些?
  17. SQL/PL SQL
  18. Linux命令中的箭头符号总结
  19. sql 语句中count()条件计数
  20. linux系统--文件目录

热门文章

  1. 利用计算机进行文字处理就是进行文字的录入,利用计算机进行古籍整理的方法...
  2. 中央和省级产业政策匹配数据(含完整stata代码)
  3. mono:利用wxWindows开发界面程序
  4. NVIDIA:构建加速计算生态,推动深度学习应用落地
  5. visio画图复制粘贴到word_visio复制粘贴到word中
  6. neatupload上传文件配置
  7. 迟滞比较器及施密特触发器详解
  8. 麟龙指标通达信指标公式源码_麟龙新决策曲线A通达信指标公式源码
  9. 大众点评字体_【网络爬虫实战】解决大众点评搜索页面字体加密
  10. 百度首页被tn劫持的办法有那些、两种解决百度劫持的方法