网易社招Java面试经历分享

1、RPC原理

1)为什么会出现RPC

RPC(Remote Procedure Call Protocol)——远程过程调用协议。


一般来说,自己写程序然后本地调用,这种程序的特点是服务的消费方和提供方。当我们进入公司时,面对的很可能就是成千上万的服务提供方,这时候就需要使用RPC来进行远程服务调用。RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了近似于无限制提升的可能。


2RPC的组成

①客户端:服务的调用方

②客户端存根:存放服务端的地址消息,再将客户端的请求参数打包成网络消息,③然后通过网络远程发送给服务方。

④服务端:真正的服务提供者。

⑤服务端存根:接收客户端发送过来的消息,将消息解包,并调用本地的方法。


2、RPC的过程?

3、如何做到透明化远程服务调用?

动态代理,把本地调用代理成网络调用


4、如何进行服务发布?(Zookeeper

5、如何进行序列化与反序列化?(ProtobufThriftAvro

6、如何进行通信?(NIO--->Netty

7、HashMap原理

8、Redis缓存回收机制

1)数据过期:

①定时删除策略:Redis启动一个定时器监控所有的key,一旦有过期的话就进行删除(遍历所有key,非常耗费CPU

②惰性删除策略:获取key的时候判断是否过期, 过期则进行删除

Redis采用的方式:①(随机抓取一部分key进行检测)+②


2)内存淘汰:

noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。(Redis 默认策略)

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 Key。(LRU推荐使用)

allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个 Key

volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的 Key。这种情况一般是把 Redis 既当缓存,又做持久化存储的时候才用。

volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个 Key

volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的 Key 优先移除。不推荐。如果没有对应的键,则回退到noeviction策略。


9、Redis主从同步

1)主从复制作用

①数据冗余

②故障恢复(服务冗余)

③负载均衡

④读写分离(主节点写操作、从节点读操作)


2)主从复制过程

①连接建立阶段

步骤1:保存主节点信息

步骤2:建立socket连接

步骤3:发送ping命令

步骤4:身份验证

步骤5:发送从节点端口信息

②数据同步阶段

从节点向主节点发送psync命令

根据主从节点当前状态的不同,可以分为全量复制和部分复制

③命令传播阶段

主从节点进入命令传播阶段;在这个阶段主节点将自己执行的写命令发送给从节点,从节点接收命令并执行,从而保证主从节点数据的一致性。


3)介绍全量复制和部分复制

①全量复制:用于初次复制或其他无法进行部分复制的情况,将主节点中的所有数据都发送给从节点,是一个非常重型的操作。

②部分复制:用于网络中断等情况后的复制,只将中断期间主节点执行的写命令发送给从节点,与全量复制相比更加高效。需要注意的是,如果网络中断时间过长,导致主节点没有能够完整地保存中断期间执行的写命令,则无法进行部分复制,仍使用全量复制。


4)主从复制缺点:故障恢复无法自动化;写操作无法负载均衡;存储能力受到单机的限制。


10、为什么会有哨兵机制?

在主从复制的基础上,哨兵实现了自动化的故障恢复。


11、哨兵机制作用?

1)监控(Monitoring):哨兵会不断地检查主节点和从节点是否运作正常。

2)自动故障转移(Automatic failover):当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。

3)配置提供者(Configuration provider):客户端在初始化时,通过连接哨兵来获得当前Redis服务的主节点地址。

4)通知(Notification):哨兵可以将故障转移的结果发送给客户端。


12、哨兵机制节点组成?

它由两部分组成,哨兵节点和数据节点:

1)哨兵节点:哨兵系统由一个或多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据。

2)数据节点:主节点和从节点都是数据节点。


13、哨兵机制原理?

1)定时任务:每个哨兵节点维护了3个定时任务。定时任务的功能分别如下:通过向主从节点发送info命令获取最新的主从结构;通过发布订阅功能获取其他哨兵节点的信息;通过向其他节点发送ping命令进行心跳检测,判断是否下线。

2)主观下线:在心跳检测的定时任务中,如果其他节点超过一定时间没有回复,哨兵节点就会将其进行主观下线。顾名思义,主观下线的意思是一个哨兵节点主观地判断下线;与主观下线相对应的是客观下线。

3)客观下线:哨兵节点在对主节点进行主观下线后,会通过sentinel is-master-down-by-addr命令询问其他哨兵节点该主节点的状态;如果判断主节点下线的哨兵数量达到一定数值,则对该主节点进行客观下线。

4)选举领导者哨兵节点:当主节点被判断客观下线以后,各个哨兵节点会进行协商,选举出一个领导者哨兵节点,并由该领导者节点对其进行故障转移操作。监视该主节点的所有哨兵都有可能被选为领导者,选举使用的算法是Raft算法;Raft算法的基本思路是先到先得:即在一轮选举中,哨兵AB发送成为领导者的申请,如果B没有同意过其他哨兵,则会同意A成为领导者。选举的具体过程这里不做详细描述,一般来说,哨兵选择的过程很快,谁先完成客观下线,一般就能成为领导者。

5)故障转移:选举出的领导者哨兵,开始进行故障转移操作,该操作大体可以分为3个步骤:


①在从节点中选择新的主节点:选择的原则是,首先过滤掉不健康的从节点;然后选择优先级最高的从节点(slave-priority指定);如果优先级无法区分,则选择复制偏移量最大的从节点;如果仍无法区分,则选择runid最小的从节点。

②更新主从状态:通过slaveof no one命令,让选出来的从节点成为主节点;并通过slaveof命令让其他节点成为其从节点。

③将已经下线的主节点(6379)设置为新的主节点的从节点,当6379重新上线后,它会成为新的主节点的从节点。


14、哨兵机制缺点

写操作无法负载均衡;存储能力受到单机的限制。(Redis集群解决了该情况)


15、Zookeeper锁是如何实现的?

一般使用Curator进行使用Zookeeper锁,例如有两个客户端A和客户端B,首先A先在锁节点下创建例如01子节点的锁,然后再获取节点信息,发现自己的01节点排名第一,那么就获得锁。

客户端B也需要获取锁,现在锁节点下创建例如02的子节点,然后再获取锁节点信息,发现锁节点信息为[01,02],并不排第一,因此获取不到锁,客户端B会在他的顺序节点的上一个顺序节点加一个监听器。

当客户端A使用完锁,删除01节点,客户端B获取到01删除的监听,然后发现自己的02节点排名第一,那么就获取到锁。


16、分布式缓存读写不一致问题

17、Java线程你是怎么使用的

18、数据库是如何调优的?

1)数据表加合适的索引

2)针对执行计划进行优化

3)根据慢sql进行优化

4)加缓存

5)参数调优


19、git rebase命令发生了什么?

rebase命令可以帮我们把整个提交历史变成干净清晰的一条线。


20、手撕代码。牛客题霸上的原题,可以去看看:NC13 二叉树的最大深度


#网易##社招##Java工程师##面经#
全部评论
老哥几年经验
点赞 回复
分享
发布于 2020-12-01 10:48

相关推荐

2 62 评论
分享
牛客网
牛客企业服务