【金三银四】Java中间件面试题(2021最新版)

小编分享的这份金三银四Java后端开发面试总结包含了JavaOOP、Java集合容器、Java异常、并发编程、Java反射、Java序列化、JVM、Redis、Spring MVC、MyBatis、MySQL数据库、消息中间件MQ、Dubbo、Linux、ZooKeeper、 分布式&数据结构与算法等26个专题技术点,都是小编在各个大厂总结出来的面试真题,已经有不少粉丝靠这份PDF拿下众多大厂的offer,今天在这里总结分享给到你们!【持续更新中!】java

完整版Java面试题地址:2021最新面试题合集集锦node

前言

现今时代,系统愈来愈复杂,数据来越多,系统间的交互也就变得愈来愈重要,同时也变得愈来愈困难。而消息中间件在其中起到了一个中间桥梁的重要做用。所以,面试中也常常会被问到消息中间件相关的问题。从其使用到其原理设计,都会是面试官感兴趣的一个点。本场小编就以zookeeper / RocketMQ 为例,简单介绍消息中间件并在其中穿插面试官常会说起的消息中间件相关的问题,小编这里还总结了一份中间件的思惟导图,分享给到你们。nginx

【金三银四】Java中间件面试题(2021最新版)

Zookeeper

1. ZooKeeper 是什么?

ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根 据节点提交的反馈进行下一步合理操做。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。面试

分布式应用程序能够基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。算法

Zookeeper 保证了以下分布式一致性特性:数据库

(1)顺序一致性编程

(2)原子性后端

(3)单一视图设计模式

(4)可靠性浏览器

(5)实时性(最终一致性)

客户端的读请求能够被集群中的任意一台机器处理,若是读请求在节点上注册了监听器,这个监听器也 是由所链接的 zookeeper 机器来处理。对于写请求,这些请求会同时发给其余 zookeeper 机器而且达成一致后,请求才会返回成功。所以,随着 zookeeper 的集群机器增多,读请求的吞吐会提升可是写 请求的吞吐会降低。

有序性是 zookeeper 中很是重要的一个特性,全部的更新都是全局有序的,每一个更新都有一个惟一的时间戳,这个时间戳称为 zxid(Zookeeper Transaction Id)。而读请求只会相对于更新有序,也就是 读请求的返回结果中会带有这个zookeeper 最新的 zxid。

2. ZooKeeper 提供了什么?

(1)文件系统

(2)通知机制

3.Zookeeper 文件系统

Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。与文件系统不一样的是,这些节点均可以设置关联的数据,而文件系统中只有文件节点能够存放数据而目录节点不行。 Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper 不能用于存放大量的数据,每一个节点的存放数据上限为1M。

4. ZAB 协议?

ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。 ZAB 协议包括两种基本的模式:崩溃恢复和消息广播。 当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障致使不存在过半的服务器 与 Leader 服务器保持正常通讯时,全部进程(服务器)进入崩溃恢复模式,首先选举产生新的 Leader服务器,而后集群中 Follower 服务器开始与新的 Leader 服务器进行数据同步,当集群中超过半数机器与该 Leader服务器完成数据同步以后,退出恢复模式进入消息广播模式,Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。

5. 四种类型的数据节点 Znode

(1)PERSISTENT-持久节点

除非手动删除,不然节点一直存在于 Zookeeper 上

(2)EPHEMERAL-临时节点

临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper 链接断开不必定会话失效),那么这个客户端建立的全部临时节点都会被移除。

(3)PERSISTENT_SEQUENTIAL-持久顺序节点

基本特性同持久节点,只是增长了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

(4)EPHEMERAL_SEQUENTIAL-临时顺序节点

基本特性同临时节点,增长了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。

6. Zookeeper Watcher 机制 -- 数据变动通知

Zookeeper 容许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通知来实现分布式的通知功能,而后客户端根据Watcher 通知状态和事件类型作出业务上的改变。

工做机制:

(1)客户端注册 watcher

(2)服务端处理 watcher

(3)客户端回调 watcher

Watcher 特性总结:

(1)一次性不管是服务端仍是客户端,一旦一个 Watcher 被 触 发 ,Zookeeper 都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,否则对于更新很是频繁的节点,服务端会不断的向客户端发送事件通知,不管对于网络仍是服务端的压力都很是大。

(2)客户端串行执行

客户端 Watcher 回调的过程是一个串行同步的过程。

(3)轻量

3.一、Watcher 通知很是简单,只会告诉客户端发生了事件,而不会说明事件的具体内容。

3.二、客户端向服务端注册 Watcher 的时候,并不会把客户端真实的 Watcher 对象实体传递到服务端,仅仅是在客户端请求中使用 boolean 类型属性进行了标记。

(4)watcher event 异步发送 watcher 的通知事件从 server 发送到 client 是异步的,这就存在一个问题,不一样的客户端和服务器之间经过 socket 进行通讯,因为网络延迟或其余因素致使客户端在不通的时刻监听到事件,因为 Zookeeper 自己提供了 ordering guarantee,即客户端监听事件后,才会感知它所监视 znode发生了变化。因此咱们使用 Zookeeper 不能指望可以监控到节点每次的变化。Zookeeper 只能保证最终的一致性,而没法保证强一致性。

(5)注册 watcher getData、exists、getChildren

(6)触发 watcher create、delete、setData

(7)当一个客户端链接到一个新的服务器上时,watch 将会被以任意会话事件触发。当与一个服务器失去链接的时候,是没法接收到 watch 的。而当 client 从新链接时,若是须要的话,全部先前注册过的 watch,都会被从新注册。一般这是彻底透明的。只有在一个特殊状况下,watch 可能会丢失:对于一个未建立的 znode的 exist watch,若是在客户端断开链接期间被建立了,而且随后在客户端链接上以前又删除了,这种状况下,这个 watch 事件可能会被丢失。

7. 客户端注册 Watcher 实现

(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象

(2)标记请求 request,封装 Watcher 到 WatchRegistration

(3)封装成 Packet 对象,发服务端发送 request

(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理

(5)请求返回,完成注册。

8. 服务端处理 Watcher 实现

【金三银四】Java中间件面试题(2021最新版)

9. 客户端回调 Watcher

  • 客户端 SendThread 线程接收事件通知,交由 EventThread 线程回调 Watcher。
  • 客户端的 Watcher 机制一样是一次性的,一旦被触发后,该 Watcher 就失效了。

10. ACL 权限控制机制

【金三银四】Java中间件面试题(2021最新版)

11. Chroot 特性

【金三银四】Java中间件面试题(2021最新版)

12. 会话管理

【金三银四】Java中间件面试题(2021最新版)

13. 服务器角色

【金三银四】Java中间件面试题(2021最新版)

14. Zookeeper 下 Server 工做状态

服务器具备四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。

(1)LOOKING:寻 找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,所以须要进入 Leader 选举状态。

(2)FOLLOWING:跟随者状态。代表当前服务器角色是 Follower。

(3)LEADING:领导者状态。代表当前服务器角色是 Leader。

(4)OBSERVING:观察者状态。代表当前服务器角色是 Observer。

15. 数据同步

【金三银四】Java中间件面试题(2021最新版)

16. zookeeper 是如何保证事务的顺序一致性的?

【金三银四】Java中间件面试题(2021最新版)

17. 分布式集群中为何会有 Master?

在分布式环境中,有些业务逻辑只须要集群中的某一台机器进行执行,其余的机器能够共享这个结果,这样能够大大减小重复计算,提升性能,因而就须要进行leader 选举。

18. zk 节点宕机如何处理?

【金三银四】Java中间件面试题(2021最新版)

19. zookeeper 负载均衡和 nginx 负载均衡区别

zk 的负载均衡是能够调控,nginx 只是能调权重,其余须要可控的都须要本身写插件;可是 nginx 的吞吐量比 zk 大不少,应该说按业务选择用哪一种方式。

20. Zookeeper 有哪几种几种部署模式?

部署模式:单机模式、伪集群模式、集群模式

21. 集群最少要几台机器,集群规则是怎样的?

集群规则为 2N+1 台,N>0,即 3 台

22. 集群支持动态添加机器吗?

【金三银四】Java中间件面试题(2021最新版)

23. Zookeeper 对节点的 watch 监听通知是永久的吗?为何不是永久的?

【金三银四】Java中间件面试题(2021最新版)

24. Zookeeper 的 java 客户端都有哪些?

java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。

25. chubby 是什么,和 zookeeper 比你怎么看?

chubby 是 google 的,彻底实现 paxos 算法,不开源。zookeeper 是 chubby的开源实现,使用 zab协议,paxos 算法的变种。

26. 说几个 zookeeper 经常使用的命令。

经常使用命令:ls get set create delete 等。

27. ZAB 和 Paxos 算法的联系与区别?

【金三银四】Java中间件面试题(2021最新版)

28. Zookeeper 的典型应用场景

Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可使用它来进行分布式数据的发布和订阅。

经过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,能够很是方便的构建一系列分布式应用中年都会涉及的核心功能,如:

  • (1)数据发布/订阅
  • (2)负载均衡
  • (3)命名服务
  • (4)分布式协调/通知
  • (5)集群管理(6)Master 选举
  • (7)分布式锁
  • (8)分布式队列

数据发布/订阅

介绍

数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者进行数据订阅。

目的

动态获取数据(配置信息)

实现数据(配置信息)的集中式管理和数据的动态更新

设计模式

Push 模式

Pull 模式

数据(配置信息)特性

(1)数据量一般比较小

(2)数据内容在运行时会发生动态更新

(3)集群中各机器共享,配置一致

如:机器列表信息、运行时开关配置、数据库配置信息等

基于 Zookeeper 的实现方式

· 数据存储:将数据(配置信息)存储到 Zookeeper 上的一个数据节点

· 数据获取:应用在启动初始化节点从 Zookeeper 数据节点读取数据,并在该节点上注册一个数据变动

Watcher

· 数据变动:当变动数据时,更新 Zookeeper 对应节点数据,Zookeeper会将数据变动通知发到各客户

端,客户端接到通知后从新读取变动后的数据便可。

负载均衡

zk 的命名服务

命名服务是指经过指定的名字来获取资源或者服务的地址,利用 zk 建立一个全局的路径,这个路径就能够做为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

分布式通知和协调

对于系统调度来讲:操做人员发送通知实际是经过控制台改变某个节点的状态,而后 zk 将这些变化发送给注册了这个节点的 watcher 的全部客户端。对于执行状况汇报:每一个工做进程都在某个目录下建立一个临时节点。并携带工做的进度数据,这样汇总的进程能够监控目录子节点的变化得到工做进度的实时的全局状况。

zk 的命名服务(文件系统)

命名服务是指经过指定的名字来获取资源或者服务的地址,利用 zk 建立一个全局的路径,便是惟一的路径,这个路径就能够做为一个名字,指向集群中的集群,提供的服务的地址,或者一个远程的对象等等。

zk 的配置管理(文件系统、通知机制)程序分布式的部署在不一样的机器上,将程序的配置信息放在 zk 的 znode 下,当有配置发生改变时,也

就是 znode 发生变化时,能够经过改变 zk 中某个目录节点的内容,利用 watcher 通知给各个客户端,从而更改配置。

Zookeeper 集群管理(文件系统、通知机制)

所谓集群管理无在意两点:是否有机器退出和加入、选举 master。对于第一点,全部机器约定在父目录下建立临时目录节点,而后监听父目录节点的子节点变化消息。一旦有机器挂掉,该机器与 zookeeper 的链接断开,其所建立的临时目录节点被删除,全部其余机器都收到通知:某个兄弟目录被删除,因而,全部人都知道:它上船了。新机器加入也是相似,全部机器收到通知:新兄弟目录加入,highcount 又有了,对于第二点,咱们稍微改变一下,全部机器建立临时顺序编号目录节点,每次选取编号最小的机器做为 master 就好。

Zookeeper 分布式锁(文件系统、通知机制)

有了 zookeeper 的一致性文件系统,锁的问题变得容易。锁服务能够分为两类,一个是保持独占,另外一个是控制时序。对于第一类,咱们将 zookeeper 上的一个 znode 看做是一把锁,经过 createznode的方式来实现。所

有客户端都去建立 /distribute_lock 节点,最终成功建立的那个客户端也即拥有了这把锁。用完删除掉本身建立的 distribute_lock 节点就释放出锁。对于第二类, /distribute_lock 已经预先存在,全部客户端在它下面建立临时顺序编号目录节点,和选master 同样,编号最小的得到锁,用完删除,依次方便。Zookeeper 队列管理(文件系统、通知机制)

两种类型的队列:

(1)同步队列,当一个队列的成员都聚齐时,这个队列才可用,不然一直等待全部成员到达。

(2)队列按照 FIFO 方式进行入队和出队操做。

第一类,在约定目录下建立临时目录节点,监听节点数目是不是咱们要求的数目。

第二类,和分布式锁服务中的控制时序场景基本原理一致,入列有编号,出列按编号。在特定的目录下

建立 PERSISTENT_SEQUENTIAL 节点,建立成功时Watcher 通知等待的队列,队列删除序列号最小的节点用以消费。此场景下Zookeeper 的 znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编号,按序取出便可。因为建立的节点是持久化的,因此没必要担忧队列消息的丢失问题。

RabbitMQ

1. 什么是MQ

MQ就是消息队列。是软件和软件进行通讯的中间件产品

2. MQ的优势

  • 异步处理 - 相比于传统的串行、并行方式,提升了系统吞吐量。
  • 应用解耦 - 系统间经过消息通讯,不用关心其余系统的处理。
  • 流量削锋 - 能够经过消息队列长度控制请求量;能够缓解短期内的高并发请求。
  • 日志处理 - 解决大量日志传输。
  • 消息通信 - 消息队列通常都内置了高效的通讯机制,所以也能够用在纯的消息通信。好比实
  • 现点对点消息队列,或者聊天室等。

3. 解耦、异步、削峰是什么?。

  • 解耦:A 系统发送数据到 BCD 三个系统,经过接口调用发送。若是 E 系统也要这个数据呢?那若是 C 系统如今不须要了呢?A 系统负责人几乎崩溃…A 系统跟其它各类乱七八糟的系统严重耦合,A 系统产生一条比较关键的数据,不少系统都须要 A 系统将这个数据发送过来。若是使用 MQ,A系统产生一条数据,发送到 MQ 里面去,哪一个系统须要数据本身去 MQ 里面消费。若是新系统需 要数据,直接从 MQ 里消费便可;若是某个系统不须要这条数据了,就取消对 MQ 消息的消费便可。这样下来,A 系统压根儿不须要去考虑要给谁发送数据,不须要维护这个代码,也不须要考虑 人家是否调用成功、失败超时等状况。就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。可是其实这个调用是不须要直接同步调用接口的,若是用 MQ 给它异步化解耦。
  • 异步:A 系统接收一个请求,须要在本身本地写库,还须要在 BCD 三个系统写库,本身本地写库 要 3ms,BCD 三个系统分别写库要 300ms、450ms、200ms。最终请求总延时是 3 + 300 + 450 + 200 = 953ms,接近 1s,用户感受搞个什么东西,慢死了慢死了。用户经过浏览器发起请求。 若是使用 MQ,那么 A 系统连续发送 3 条消息到 MQ 队列中,假如耗时 5ms,A 系统从接受一个 请求到返回响应给用户,总时长是 3 + 5 = 8ms。
  • 削峰:减小高峰时期对服务器压力

4. 消息队列有什么缺点

【金三银四】Java中间件面试题(2021最新版)

5. 大家公司生产环境用的是什么消息中间件?

  • 这个首先你能够说下大家公司选用的是什么消息中间件,好比用的是RabbitMQ,而后能够初步给一些你对不一样MQ中间件技术的选型分析。
  • 举个例子:好比说ActiveMQ是老牌的消息中间件,国内不少公司过去运用的仍是很是普遍的,功能很强大。
  • 可是问题在于无法确认ActiveMQ能够支撑互联网公司的高并发、高负载以及高吞吐的复杂场景,在国内互联网公司落地较少。并且使用较多的是一些传统企业,用ActiveMQ作异步调用和系统解耦。
  • 而后你能够说说RabbitMQ,他的好处在于能够支撑高并发、高吞吐、性能很高,同时有很是完善便捷的后台管理界面可使用。
  • 另外,他还支持集群化、高可用部署架构、消息高可靠支持,功能较为完善。

  • 并且通过调研,国内各大互联网公司落地大规模RabbitMQ集群支撑自身业务的case较多,国内各类中小型互联网公司使用RabbitMQ的实践也比较多。
  • 除此以外,RabbitMQ的开源社区很活跃,较高频率的迭代版本,来修复发现的bug以及进行各类优化,所以综合考虑事后,公司采起了RabbitMQ。
  • 可是RabbitMQ也有一点缺陷,就是他自身是基于erlang语言开发的,因此致使较为难以分析里面的源码,也较难进行深层次的源码定制和改造,毕竟须要较为扎实的erlang语言功底才能够。
  • 而后能够聊聊RocketMQ,是阿里开源的,通过阿里的生产环境的超高并发、高吞吐的考验,性能卓越,同时还支持分布式事务等特殊场景。
  • 并且RocketMQ是基于Java语言开发的,适合深刻阅读源码,有须要能够站在源码层面解决线上生产问题,包括源码的二次开发和改造。

  • 另外就是Kafka。Kafka提供的消息中间件的功能明显较少一些,相对上述几款MQ中间件要少不少。
  • 可是Kafka的优点在于专为超高吞吐量的实时日志采集、实时数据同步、实时数据计算等场景来设计。
  • 所以Kafka在大数据领域中配合实时计算技术(好比Spark Streaming、Storm、Flink)使用的较多。可是在传统的MQ中间件使用场景中较少采用。

6. Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

7. MQ 有哪些常见问题?如何解决这些问题?

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

8. 什么是RabbitMQ?

RabbitMQ是一款开源的,Erlang编写的,消息中间件; 最大的特色就是消费并不须要确保提供方 存在,实现了服务之间的高度解耦 能够用它来:解耦、异步、削峰。

9. rabbitmq 的使用场景

(1)服务间异步通讯

(2)顺序消费

(3)定时任务

(4)请求削峰

10. RabbitMQ基本概念

【金三银四】Java中间件面试题(2021最新版)

11. RabbitMQ的工做模式

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

12. 如何保证RabbitMQ消息的顺序性?

  • 拆分多个 queue(消息队列),每一个 queue(消息队列) 一个 consumer(消费者),就是多一些 queue(消息队列)而已,确实是麻烦点;
  • 或者就一个 queue (消息队列)可是对应一个 consumer(消费者),而后这个 consumer(消费者)内部用内存队列作排队,而后分发给底层不一样的 worker 来处理。

13. 消息如何分发?

  • 若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消费者。每条消息只会分发给一个订阅的消费者(前提是消费者可以正常处理消息并进行确认)。经过路由可实现多消费的功能

14. 消息怎么路由?

【金三银四】Java中间件面试题(2021最新版)

15. 消息基于什么传输?

【金三银四】Java中间件面试题(2021最新版)

16. 如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?

【金三银四】Java中间件面试题(2021最新版)

17. 如何确保消息正确地发送至 RabbitMQ? 如何确保消息接收方消费了消息?

【金三银四】Java中间件面试题(2021最新版)

18. 如何保证RabbitMQ消息的可靠传输?

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

19. 为何不该该对全部的 message 都使用持久化机制?

【金三银四】Java中间件面试题(2021最新版)

20. 如何保证高可用的?RabbitMQ 的集群

【金三银四】Java中间件面试题(2021最新版)

【金三银四】Java中间件面试题(2021最新版)

21. 如何解决消息队列的延时以及过时失效问题?消息队列满了之后该怎么处理?有几百万消息持续积压几小时,怎么办?

【金三银四】Java中间件面试题(2021最新版)

22. 设计MQ思路

【金三银四】Java中间件面试题(2021最新版)

23.RoctetMq的架构

  • NameServer
  • Broker
  • Producer
  • Producer的负载均衡
  • 发送的三种策略
  • Consumer
  • 推拉消费模式
  • 集群仍是广播
  • Consumer的负载均衡

24. RocketMq消息模型(专业术语)

  • Message
  • Topic
  • Tag
  • Group
  • Message Queue
  • offset

25.核心问题

  • 顺序消息
  • 消息过滤
  • 消息去重
  • 分布式事务消息
  • 消息的可用性
  • 刷盘实现
  • 负载均衡

该面试题答案解析完整文档获取方式:【Java中间件面试题【附答案解析】

最后

篇幅有限,其余内容就不在这里一一展现了,整理不易,欢迎你们一块儿交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!重要的事情说三遍,转发+转发+转发,必定要记得转发哦!!!