小编分享的这份金三银四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
ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根 据节点提交的反馈进行下一步合理操做。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。面试
分布式应用程序能够基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。算法
Zookeeper 保证了以下分布式一致性特性:数据库
(1)顺序一致性编程
(2)原子性后端
(3)单一视图设计模式
(4)可靠性浏览器
(5)实时性(最终一致性)
客户端的读请求能够被集群中的任意一台机器处理,若是读请求在节点上注册了监听器,这个监听器也 是由所链接的 zookeeper 机器来处理。对于写请求,这些请求会同时发给其余 zookeeper 机器而且达成一致后,请求才会返回成功。所以,随着 zookeeper 的集群机器增多,读请求的吞吐会提升可是写 请求的吞吐会降低。
有序性是 zookeeper 中很是重要的一个特性,全部的更新都是全局有序的,每一个更新都有一个惟一的时间戳,这个时间戳称为 zxid(Zookeeper Transaction Id)。而读请求只会相对于更新有序,也就是 读请求的返回结果中会带有这个zookeeper 最新的 zxid。
(1)文件系统
(2)通知机制
Zookeeper 提供一个多层级的节点命名空间(节点称为 znode)。与文件系统不一样的是,这些节点均可以设置关联的数据,而文件系统中只有文件节点能够存放数据而目录节点不行。 Zookeeper 为了保证高吞吐和低延迟,在内存中维护了这个树状的目录结构,这种特性使得Zookeeper 不能用于存放大量的数据,每一个节点的存放数据上限为1M。
ZAB 协议是为分布式协调服务 Zookeeper 专门设计的一种支持崩溃恢复的原子广播协议。 ZAB 协议包括两种基本的模式:崩溃恢复和消息广播。 当整个 zookeeper 集群刚刚启动或者 Leader 服务器宕机、重启或者网络故障致使不存在过半的服务器 与 Leader 服务器保持正常通讯时,全部进程(服务器)进入崩溃恢复模式,首先选举产生新的 Leader服务器,而后集群中 Follower 服务器开始与新的 Leader 服务器进行数据同步,当集群中超过半数机器与该 Leader服务器完成数据同步以后,退出恢复模式进入消息广播模式,Leader 服务器开始接收客户端的事务请求生成事物提案来进行事务请求处理。
(1)PERSISTENT-持久节点
除非手动删除,不然节点一直存在于 Zookeeper 上
(2)EPHEMERAL-临时节点
临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与zookeeper 链接断开不必定会话失效),那么这个客户端建立的全部临时节点都会被移除。
(3)PERSISTENT_SEQUENTIAL-持久顺序节点
基本特性同持久节点,只是增长了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
(4)EPHEMERAL_SEQUENTIAL-临时顺序节点
基本特性同临时节点,增长了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
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 事件可能会被丢失。
(1)调用 getData()/getChildren()/exist()三个 API,传入 Watcher 对象
(2)标记请求 request,封装 Watcher 到 WatchRegistration
(3)封装成 Packet 对象,发服务端发送 request
(4)收到服务端响应后,将 Watcher 注册到 ZKWatcherManager 中进行管理
(5)请求返回,完成注册。
服务器具备四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。
(1)LOOKING:寻 找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,所以须要进入 Leader 选举状态。
(2)FOLLOWING:跟随者状态。代表当前服务器角色是 Follower。
(3)LEADING:领导者状态。代表当前服务器角色是 Leader。
(4)OBSERVING:观察者状态。代表当前服务器角色是 Observer。
在分布式环境中,有些业务逻辑只须要集群中的某一台机器进行执行,其余的机器能够共享这个结果,这样能够大大减小重复计算,提升性能,因而就须要进行leader 选举。
zk 的负载均衡是能够调控,nginx 只是能调权重,其余须要可控的都须要本身写插件;可是 nginx 的吞吐量比 zk 大不少,应该说按业务选择用哪一种方式。
部署模式:单机模式、伪集群模式、集群模式
集群规则为 2N+1 台,N>0,即 3 台
java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator。
chubby 是 google 的,彻底实现 paxos 算法,不开源。zookeeper 是 chubby的开源实现,使用 zab协议,paxos 算法的变种。
经常使用命令:ls get set create delete 等。
Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架,开发人员可使用它来进行分布式数据的发布和订阅。
经过对 Zookeeper 中丰富的数据节点进行交叉使用,配合 Watcher 事件通知机制,能够很是方便的构建一系列分布式应用中年都会涉及的核心功能,如:
数据发布/订阅
介绍
数据发布/订阅系统,即所谓的配置中心,顾名思义就是发布者发布数据供订阅者进行数据订阅。
目的
动态获取数据(配置信息)
实现数据(配置信息)的集中式管理和数据的动态更新
设计模式
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 序列号就是消息的编号,按序取出便可。因为建立的节点是持久化的,因此没必要担忧队列消息的丢失问题。
MQ就是消息队列。是软件和软件进行通讯的中间件产品
另外,他还支持集群化、高可用部署架构、消息高可靠支持,功能较为完善。
并且RocketMQ是基于Java语言开发的,适合深刻阅读源码,有须要能够站在源码层面解决线上生产问题,包括源码的二次开发和改造。
RabbitMQ是一款开源的,Erlang编写的,消息中间件; 最大的特色就是消费并不须要确保提供方 存在,实现了服务之间的高度解耦 能够用它来:解耦、异步、削峰。
(1)服务间异步通讯
(2)顺序消费
(3)定时任务
(4)请求削峰
该面试题答案解析完整文档获取方式:【Java中间件面试题【附答案解析】】
篇幅有限,其余内容就不在这里一一展现了,整理不易,欢迎你们一块儿交流,喜欢小编分享的文章记得关注我点赞哟,感谢支持!重要的事情说三遍,转发+转发+转发,必定要记得转发哦!!!