分布式相关(面试题)
Posted 清远初
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式相关(面试题)相关的知识,希望对你有一定的参考价值。
目录
3、什么是 redis 持久化?rdb 和 aof 的比较?
13、为什么 Redis 的操作是原子性的,怎么保证原子性?
36、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别?
55、如何重新加载 Spring Boot 上的更改,而无需重新启动服务器?
57、如何在 Spring Boot 中禁用 Actuator 端点安全性?
1.Redis 和 Memcache 的区别?
1、存储方式 Memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。 Redis 有部份存在硬盘上,redis 可以持久化其数据
2、数据支持类型 memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型 ,提供 list,set,zset,hash 等数据结构的存储
3、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。
4、value 值大小不同:Redis 最大可以达到 1gb;memcache 只有 1mb。
5、redis 的速度比 memcached 快很多
6、Redis 支持数据的备份,即 master-slave 模式的数据备份。
2、使用 Redis 有哪些好处?
(1) 速度快,因为数据存在内存中,类似于 HashMap,HashMap 的优势就是查找和操作的时间复杂度都是 O(1)
(2) 支持丰富数据类型,支持 string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按 key 设置过期时间,过期后将会自动删除
3、什么是 redis 持久化?rdb 和 aof 的比较?
持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。
比较:
1、aof 文件比 rdb 更新频率高,优先使用 aof 还原数据。
2、aof 比 rdb 更安全也更大
3、rdb 性能比 aof 好
4、如果两个都配了优先加载 AOF
4、Redis 最适合的场景?
(1)、会话缓存(Session Cache) 最常用的一种使用 Redis 的情景是会话缓存(session cache)。用 Redis 缓存会话比其他存储(如 Memcached)的优势在于:Redis 提供持久化。
(2)、全页缓存(FPC) 除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了Redis 实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 php 本地 FPC。 再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。
(3)、队列 Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop 操作。
(4),排行榜/计数器 Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:
(5)、发布/订阅 最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis 的发布/订阅功能来建立聊天系统!
5、redis 哈希槽的概念?
Redis 集群没有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有 16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽,集群的每个节点负责一部分 hash 槽。
6、怎么理解 Redis 事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行,事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
7、redis 的淘汰策略有哪些?
noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但 DEL 和几个例外) allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。 allkeys-random: 回收随机的键使得新添加的数据有空间存放。volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。
8、redis 有哪些数据结构?
String、List、Set、Zset(Sorted Set)、hash
9、redis 缓存穿透、缓存雪崩、缓存击穿?
10、redis 如何实现高并发?
redis 通过一主多从,主节点负责写,从节点负责读,读写分离,从而实现高并发。
11、redis 如何实现高可用?
主备切换,哨兵集群,主节点宕机的情况下,自动选举出一个从节点变成主节点,从而保证 了 redis 集群的高可用。
12、redis 单线程还能处理速度那么快?
首先,redis 是单进程单线程的 k-v 内存型可持久化数据库。单线程还能处理速度很快的原因:
1、redis 操作是基于内存的,内存的读写速度非常快
2、正是由于 redis 的单线程模式,避免了线程上下文切换的损耗
3、redis 采用的 IO 多路复用技术,可以很好的解决多请求并发的问题。 多路代表多请求,复用代表多个请求重复使用同一个线程。
13、为什么 Redis 的操作是原子性的,怎么保证原子性?
对于 Redis 而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。 Redis 的操作之所以是原子性的,是因为 Redis 是单线程的。Redis 本身提供的所有 API 都是原子操作,Redis 中的事务其实是要保证批量操作的原子性。多个命令在并发中也是原子性的吗? 不一定, 将 get 和 set 改成单命令操作,incr 。使用 Redis 的事务,或者使用 Redis+Lua==的方式实现.
14、redis 的主从复制的实现过程?
1、从服务发送一个 sync 同步命令给主服务要求全量同步
2、主服务接收到从服务的 sync 同步命令时,会 fork 一个子进程后台执行 bgsave 命令(非阻塞)快照保存,生成 RDB 文件,并将 RDB 文件发送给从服务
3、从服务再将接收到的 RDB 文件载入自己的 redis 内存
4、待从服务将 RDB 载入完成后,主服务再将缓冲区所有写命令发送给从服务
5、从服务在将主服务所有的写命令载入内存从而实现数据的完整同步
6、从服务下次在需要同步数据时只需要发送自己的 offset 位置(相当于 mysql binlog 的位置)即可,只同步新增加的数据,再不需要全量同步
15、redis 的哨兵机制的作用?
1、监控:Sentinel 会不断的检查主服务器和从服务器是否正常运行。
2、通知:当被监控的某个 redis 服务器出现问题,Sentinel 通过 API 脚本向管理员或者其他的应用程序发送通知。
3、自动故障转移:当主节点不能正常工作时,Sentinel 会开始一次自动的故障转移操作,它会将与失效主节点是主从关系 的其中一个从节点升级为新的主节点,并且将其他的从节点指向新的主节点。
16、redis 常见的性能问题和解决方案?
(1) Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件
(2) 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即: Master <- Slave1 <- Slave2 <-Slave3…
17、分布式缓存?
硬盘上的数据,缓存在别的计算机上(非程序运行的计算机)的内存上,而且可以缓存的计算机的个数不止一个,可以使用 n 个用户通过访问 http 服务器,然后访问应用服务器资源,应用服务器调用后端的数据库,在第一次访问的时候,直接访问数据库,然后将要缓存的内容放入到 memcached 集群,集群规模根据缓存文件的大小而定。在第二次访问的时候就直接进入缓存读取,不需要进行数据库的操作。这个适合数据变化不频繁的场景,比如:互联网站显示的榜单,阅读排行等。
18、什么是 nginx?
Nginx 是一个高性能的 HTTP 和反向代理服务器,及电子邮件代理服务器,同时也是一个非 常高效的反向代理、负载平衡。
19、nginx 相对于 apache 的优点?
轻量级,同样起 web 服务,比 apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而 apache 则是阻塞型的,在高并发下 nginx 能保持低资源低消耗高性能 高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊rewrite ,比 nginx 的 rewrite 强大 模块超多,基本想到的都可以找到 少 bug ,nginx 的 bug 相对较多
20、 Nginx 优化的方式?
Nginx 运行工作进程数量 Nginx 运行工作进程个数一般设置 CPU 的核心或者核心数 x2 Nginx 运行 CPU 亲和力 比如 4 核配置: worker_processes 4; worker_cpu_affinity 0001 0010 0100 1000 Nginx 最大打开文件数 worker_rlimit_nofile 65535; Nginx 事件处理模型 events { use epoll; worker_connections 65535; multi_accept on; } nginx 采用 epoll 事件模型,处理效率高。 开启高效传输模式 连接超时时间 主要目的是保护服务器资源,CPU,内存,控制连接数,因为建立连接也是需要消耗资源的
21、Nginx 如何处理一个请求的?
首先,nginx 在启动时,会解析配置文件,得到需要监听的端口与 ip 地址,然后在 nginx 的master 进程里面先初始化好这个监控的 socket,再进行 listen,然后再 fork 出多个子进程出来, 子进程会竞争 accept 新的连接。此时,客户端就可以向 nginx 发起连接了。当客户端与nginx 进行三次握手,与 nginx 建立好一个连接后,此时,某一个子进程会 accept 成功,然后创建 nginx 对连接的封装,即 ngx_connection_t 结构体,接着,根据事件调用相应的事件处理模块,如 http 模块与客户端进行数据的交换。最后,nginx 或客户端来主动关掉连接,到此,一个连接就寿终正寝了
22、Nginx 是如何实现高并发的?
nginx 之所以可以实现高并发,与它采用的 epoll 模型有很大的关系。epoll 模型采用异步非阻塞的事件处理机制。这种机制可让 nginx 进程同时监控多个事件。 简单来说,就是异步非阻塞,使用了 epoll 模型和大量的底层代码优化。如果深入一点的话,就是 nginx 的特殊进程模型和事件模型的设计,才使其可以实现高并发。
23、Nginx 的进程模型?
它是采用一个 master 进程和多个 worker 进程的工作模式。
1、master 进程主要负责收集、分发请求。当一个请求过来时,master 拉起一个 worker 进程负责处理这个请求。;
2、master 进程也要负责监控 worker 的状态,保证高可靠性;
3、worker 进程议案设置为和 CPU 核心数一致或者其二倍。nginx 的 worker 进程和 Apache的不一样。apache 的进程在同一时间只能处理一个请求,所以它会开启很多个进程,几百甚至几千个。而 nginx 的 worker 进程在同一时间可以处理的请求数只受内存限制,因此可以处理更多请求。
24、Nginx 负载均衡的 4 种分配方式?
1、轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器 down 掉,能自动剔除。
2、weight 指定轮询几率,weight 和访问比率成正比,用于后端服务器性能不均的情况。 2、ip_hash 每个请求按访问 ip 的 hash 结果分配,这样每个访客固定访问一个后端服务器,可以解决的 问题。
3、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4、url_hash(第三方) 按访问 url 的 hash 结果来分配请求,使同样的 url 定向到同一个后端服务器,后端服务器为缓存时比较有效
25、为什么要用 Nginx?
跨平台、配置简单,非阻塞、高并发连接:处理 2-3 万并发连接数,官方监测能支持 5 万并发, 内存消耗小:开启 10 个 nginx 才占 150M 内存 ,nginx 处理静态文件好,耗费内存少,内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。 节省宽带:支持 GZIP 压缩,可以添加浏览器本地缓存 稳定性高:宕机的概率非常小 接收用户请求是异步的:浏览器将请求发送到 nginx 服务器,它先将用户请求全部接收下来,再一次性发送给后端 web 服务器,极大减轻了 web 服务器的压力,一边接收 web 服务器的返回数据,一边发送给浏览器客户端, 网络依赖性比较低,只要 ping 通就可以负载均衡,可以有多台 nginx 服务器 使用 dns 做负载均衡,事件驱动:通信机制采用 epoll 模型(nio2 异步非阻塞)
26、什么是正向代理?
一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理 正向代理总结就一句话:代理端代理的是客户端
27、什么是反向代理?
反向代理是指以代理服务器来接受 internet 上的连接请求,然后将请求,发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器 反向代理总结就一句话:代理端代理的是服务端
28、什么是负载均衡?
负载均衡即是代理服务器将接收的请求均衡的分发到各服务器中,负载均衡主要解决网络拥塞问题,提高服务器响应速度,服务就近提供,达到更好的访问质量,减少后台服务器大并发压力
29、Nginx 的调度算法有哪些?
1、sticky:通过 nginx-sticky 模块,来实现 cookie 黏贴的方式将来自同一个客户端的请求发送到同一个后端服务器上处理,这样一定程度上可以解决多个后端服务器的 session 会话同步的问题;
2、round-robin(RR):轮询,每个请求按时间顺序依次分配到不同的后端服务器,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响;
3、weight:轮询权重,weight 的值越大分配到的访问概率就越高,主要用于后端每台服务器性能不均衡的情况下,或者仅仅为在主从的情况下设置不同的权重,达到合理有效的利用主机资源。
4、least_conn:请求被发送到当前活跃连接最少的 realserver 上,会考虑到 weight 的值;
5、ip_hash:每个请求按照 IP 的哈希结果分配,使来自同一个 IP 的访客固定访问后端服务器,可以有效的解决动态网页存在的 session 共享问题。
6、fair:比 weight、ip_hash 更加智能的负载均衡算法,fair 算法可以根据页面的大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,相应时间短的优先分配。nginx 本身不支持 fair,如果需要使用这种调度算法,则必须安装 upstream_fair模块。
7、url_hash:按访问的 URL 的哈希结果来分配请求,使每个 URL 定向到后端服务器,可以进一步提高后端缓存服务器的效率。同样,nginx 本身不支持 url_hash,如果需要这种调度算法,则必须安装 nginx 的 hash 软件包。
30、Nginx 负载均衡调度状态?
常用的状态有:
1、down:表示当前的 server 暂时不参与负载均衡;
2、backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者繁忙的时候,才会 请求 backup 机器,因此这台机器的访问压力最低;
3、max_fails:允许请求失败的次数,默认为 1,当超过最大次数时,返回 proxy_next_upstraem模块定义的错误;
4、fail_timeout:请求失败超时时间,在经历了 max_fails 次失败后,暂停服务的时间。max_fails和 fail_timeout 可以一起使用。
31、可以从哪些方面来优化 nginx 服务?
1、配置 nginx 的 proxy 缓存;
2、对静态页面开启压缩功能,如 br 压缩或者 gzip 压缩;
3、调整 nginx 运行工作进程个数,最多开启 8 个 ,8 个以上话性能就不会再提升了,而且稳定性变得更低,所以 8 个足够用了;
4、调整 nginx 运行 CPU 的亲和力;
5、修改 nginx 最多可打开的文件数,若超过系统限制的最多打开文件数(ulimit -n 命令查看系统的最多打开文件数),还需要修改系统默认的文件数;
6、修改单个 worker 的最大连接数;
7、开启高效传输;
8、设置连接超时时间,以便保护服务器资源,因为建立连接也是需要消耗资源的;
9、优化 fastCGI 的一个超时时间,也可以根据实际情况对其配置缓存动态页面;
10、expires 缓存调优,主要针对图片、css、js 等元素更改较少的情况下使用。
11、配置防盗链;
12、优化内核参数,如进程可以同时打开的最大句柄数;开启 tcp 重用机制,以便允许TIME_WAIT sockets 重新用于新的 TCP 连接
32、为什么要用 MQ?
1、解耦:如果多个模块或者系统中,互相调用很复杂,维护起来比较麻烦,但是这个调用又不是同步调用,就可以运用 MQ 到这个业务中。
2、异步:这个很好理解,比如用户的操作日志的维护,可以不用同步处理,节约响应时间。
3、削峰:在高峰期的时候,系统每秒的请求量达到 5000,那么调用 MySQL 的请求也是5000,一般情况下 MySQL 的请求大概在 2000 左右,那么在高峰期的时候,数据库就被打垮了,那系统就不可用了。此时引入 MQ,在系统 A 前面加个 MQ,用户请求先到 MQ,系统 A 从 MQ 中每秒消费 2000 条数据,这样就把本来 5000 的请求变为 MySQL 可以接受的请求数量了,可以保证系统不挂掉,可以继续提供服务。MQ 里的数据可以慢慢的把它消费掉。
33、使用 MQ 会有什么问题?
(1)降低了系统可用性 (2)增加了系统的复杂性
34、怎么保证 MQ 的高可用?
RabbitMQ 是比较有代表性的,因为是基于主从做高可用性的。以他为例,自行查阅以下模 式。 rabbitmq 有三种模式:单机模式、普通集群模式、镜像集群模式。
35、MQ 的优缺点?
在特殊场景下有其对应的好处,解耦、异步、削峰。缺点有以下几个: 系统可用性降低 系统引入的外部依赖越多,越容易挂掉。万一 MQ 挂了,MQ 一挂,整套系统崩溃,你不 就完了? 系统复杂度提高 硬生生加个 MQ 进来,你怎么保证消息没有重复消费?怎么处理消息丢失的情况?怎么保 证消息传递的顺序性?问题一大堆。 一致性问题 A 系统处理完了直接返回成功了,人都以为你这个请求就成功了;但是问题是,要是 BCD 三个系统那里,BD 两个系统写库成功了,结果 C 系统写库失败了,咋整?你这数据就不一致了。
36、Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别?
对于吞吐量来说 kafka 和 RocketMQ 支撑高吞吐,ActiveMQ 和 RabbitMQ 比他们低一个数量 级。对于延迟量来说 RabbitMQ 是最低的。
1.从社区活跃度 按照目前网络上的资料,RabbitMQ、activeM 、ZeroMQ 三者中,综合来看,RabbitMQ 是首 选。
2.持久化消息比较 ActiveMq 和 RabbitMq 都支持。持久化消息主要是指我们机器在不可抗力因素等情况下挂掉了,消息不会丢失的机制。
3.综合技术实现 可靠性、灵活的路由、集群、事务、高可用的队列、消息排序、问题追踪、可视化管理工具、插件系统等等。 RabbitMq/Kafka 最好,ActiveMq 次之,ZeroMq 最差。当然 ZeroMq 也可以做到,不过自己必须手动写代码实现,代码量不小。尤其是可靠性中的:持久性、投递确认、发布者证实和高可用性。
4.高并发 毋庸置疑,RabbitMQ 最高,原因是它的实现语言是天生具备高并发高可用的 erlang 语言。
5.比较关注的比较,RabbitMQ 和 Kafka RabbitMq 比 Kafka 成熟,在可用性上,稳定性上,可靠性上,RabbitMq 胜于 Kafka(理论上)。另外,Kafka 的定位主要在日志等方面, 因为 Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以 如果业务方面还是建议选择 RabbitMq 。 还有就是,Kafka 的性能(吞吐量、TPS)比 RabbitMq 要高出来很多。
37、如何设置消息的过期时间?
设置队列属性,队列中所有消息都有相同的过期时间 对消息本身进行单独设置,每条消息的 TTL 可以不同如果两种方法一起使用,则消息的 TTL 以两者之间较小的那个数值为准
38、消息的持久化是如何实现的?
RabbitMQ 的持久化分为:交换器的持久化、队列的持久化和消息的持久化 交换器和队列的持久化都是通过在声明时将 durable 参数置为 true 实现的消息的持久化是在发送消息指定 deliveryMode 为 2 实现的
39、Zookeeper 是什么?
ZooKeeper 是一个开放源码的分布式协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
40、Zookeeper 的应用场景?
数据发布/订阅负载均衡 命名服务 分布式协调/通知集群管理 Master 选举分布式锁 分布式队列
41、四种类型的数据节点 Znode?
PERSISTENT-持久节点 除非手动删除,否则节点一直存在于 Zookeeper 上EPHEMERAL-临时节点 临时节点的生命周期与客户端会话绑定,一旦客户端会话失效(客户端与 zookeeper 连接断开不一定会话失效),那么这个客户端创建的所有临时节点都会被移除。PERSISTENT_SEQUENTIAL-持久顺序节点 基本特性同持久节点,只是增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。 EPHEMERAL_SEQUENTIAL-临时顺序节点 基本特性同临时节点,增加了顺序属性,节点名后边会追加一个由父节点维护的自增整型数字。
42、Zookeeper Watcher 机制?
1、一次性 无论是服务端还是客户端,一旦一个 Watcher 被触发,Zookeeper 都会将其从相应的存储中移除。这样的设计有效的减轻了服务端的压力,不然对于更新非常频繁的节点,服务端会不断的向客户端发送事件通知,无论对于网络还是服务端的压力都非常大。
2、客户端串行执行 客户端 Watcher 回调的过程是一个串行同步的过程。
3、轻量 3.1Watcher 通知非常简单,只会告诉客户端发生了事件,而不会说明事件的具体内容。3.2 客户端向服务端注册 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 事件可能会被丢失。
43、Zookeeper 下 Server 工作状态?
服务器具有四种状态,分别是 LOOKING、FOLLOWING、LEADING、OBSERVING。LOOKING:寻找 Leader 状态。当服务器处于该状态时,它会认为当前集群中没有 Leader,因此需要进入 Leader 选举状态。 FOLLOWING:跟随者状态。表明当前服务器角色是 Follower。LEADING:领导者状态。表明当前服务器角色是 Leader。 OBSERVING:观察者状态。表明当前服务器角色是 Observer。
44、Zookeeper 是如何保证事务的顺序一直性的?
zookeeper 采用了全局递增的事务 Id 来标识,所有的 proposal(提议)都在被提出的时候加上了 zxid,zxid 实际上是一个 64 位的数字,高 32 位是 epoch(时期; 纪元; 世; 新时代)用来标识 leader 周期,如果有新的 leader 产生出来,epoch 会自增,低 32 位用来递增计数。当新产生 proposal 的时候,会依据数据库的两阶段过程,首先会向其他的 server 发出事务执行请求,如果超过半数的机器都能执行并且能够成功,那么就会开始执行。
45、ZK 节点宕机如何处理?
Zookeeper 本身也是集群,推荐配置不少于 3 个服务器。Zookeeper 自身也要保证当一个节点宕机时,其他节点会继续提供服务。 如果是一个 Follower 宕机,还有 2 台服务器提供访问,因为 Zookeeper 上的数据是有多个副本的,数据并不会丢失; 如果是一个 Leader 宕机,Zookeeper 会选举出新的 Leader。ZK 集群的机制是只要超过半数的节点正常,集群就能正常提供服务。只有在 ZK 节点挂得太多,只剩一半或不到一半节点能工作,集群才失效。所以 3 个节点的 cluster 可以挂掉 1 个节点(leader 可以得到 2 票>1.5)2 个节点的 cluster 就不能挂掉任何 1 个节点了(leader 可以得到 1 票<=1)
46、Zookeeper 有哪几种部署模式?
部署模式:单机模式、伪集群模式、集群模式。
47、Dubbo 内置了哪几种容器?
Spring ContainerJetty ContainerLog4j Container
48、Dubbo 里面有哪几种角色?
Provider:暴露服务的服务提供方 Consumer:调用远程服务的服务消费方Registry:服务注册与发现的注册中心Monitor:统计服务的调用次数和调用时间的监控中心Container:服务运行容器
49、Dubbo 有哪几种集群容错方案,默认是那种?
Failover Cluster:失败自动切换,自动重试其他服务器(默认)Failfast Cluster:快速失败,立即报错,只发起一次调用Failsafe Cluster:失败安全,出现异常时,直接忽略 Failback Cluster:失败自动恢复,记录失败请求,定时重发Forking Cluster:并行调用多个服务器,只要一个成功即返回Broadcast Cluster:广播逐个调用所有提供者,任意一个报错则报错
50、Dubbo 有哪几种负载均衡策略,默认是哪种?
Random LoadBalance:随机,按权重设置随机概率(默认) RoundRobin LoadBalance:轮询,按公约后的权重设置轮询比率LeastActive LoadBalance:最少活跃调用次数,相同活跃数的随机 ConsistentHash LoadBalance:一直性 Hash,相同参数的请求总是发到同一提供者
51、Dubbo 的管理控制台能做什么?
管理控制台主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能。
52、什么是 Spring Boot?
多年来,随着新功能的增加,spring 变得越来越复杂。只需访问 https://spring.io/projects 页面,我们就会看到可以在我们的应用程序中使用的所有 Spring 项目的不同功能。如果必须启动一个新的 Spring 项目,我们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。因此,开始一个新的 spring 项目需要很多努力,因为我们现在必须从头开始做所有事情。 Spring Boot 是解决这个问题的方法。Spring Boot 已经建立在现有 spring 框架之上。使用 spring启动,我们避免了之前我们必须做的所有样板代码和配置。因此,Spring Boot 可以帮助我们以最少的工作量,更加健壮地使用现有的 Spring 功能。
53、Spring Boot 有哪些优点?
减少开发,测试时间和努力。 使用 JavaConfig 有助于避免使用 XML。 避免大量的 Maven 导入和各种版本冲突。 提供意见发展方法。 通过提供默认值快速开始开发。 没有单独的 Web 服务器需要。这意味着你不再需要启动 Tomcat,Glassfish 或其他任何东西。需要更少的配置 因为没有 web.xml 文件。只需添加用@ Configuration 注释的类,然后添加用@Bean 注释的方法,Spring 将自动加载对象并像以前一样对其进行管理。您甚至可以将@Autowired 添加到 bean 方法中,以使 Spring 自动装入需要的依赖关系中。基 于环 境的 配置 使 用这 些属 性, 您可 以将 您正 在使 用的 环境 传递 到应 用程 序:-Dspring.profiles.active = {enviornment} 。 在 加 载 主 应 用 程 序 属 性 文 件 后 , Spring 将 在(application{environment} .properties)中加载后续的应用程序属性文件。
54、什么是 JavaConfig?
Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯 Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig
以上是关于分布式相关(面试题)的主要内容,如果未能解决你的问题,请参考以下文章