更新一下二面吧
本来上周五面完二面反问阶段面试官说基础不太扎实,心态已经崩了,今天又收到了3面通知。遂打算写一写二面面经
自我介绍2min
项目相关
你的RPC调用的流程是什么样子的?
消费者-> 注册中心 -> 更新本地缓存 -> 与提供者建立连接 -> 序列化请求(参数,方法名等等) -> 服务端解析协议 -> 执行本地方法 -> 序列化结果返回。
你说利用Vertx实现了异步的网络通信来提升性能,怎么提升的?
答了是Vertx本身实现了异步网络通信,简要说了说异步和同步的性能区别。
你实现的多个序列化方式JDK,JSON,HESSION,Kyro有什么区别?
JDK原生性能差,JSON可读性强,性能不如二进制协议,Hession二进制,性能好,Kyro线程不安全,利用ThreadLocal来保存Kyro实例。复盘补充:跨平台,跨语言等可以扩展。
假设服务提供者出现了宕机,消费端怎么处理?
服务提供者心跳机制来保证注册中心实例的存活,消费端通过watch机制来监听注册中心的变化,监听到变化会更新本地缓存
假设此时发生暂时的网络拥塞怎么处理?
消费端有指数退避重试策略,一定程度上避免了网络拥塞。
你的负载均衡是怎么做的?
轮询,随机,一致性哈希
轮询和随机都可以一定程度上分散流量,那么一致性哈希相比于其他两种的优势?
这个忘记了,没答上来
复盘:外界对于服务宕机可以做到无感,不会造成大规模的缓存失效。并且相同的请求大概率会被hash到相同的资源上,保证了前后请求路由的一致(如果有这种需求的话)。
假设某一次你的消费端调用时出现了服务端短暂宕机又上线,此时消费端该怎么做?
重试策略 -> 重试失败则抛出异常给自行消费者处理。
八股相关(记不太清楚了)
多线程编程可以提高系统性能的原因是什么?
这个没有听懂面试官问的是什么,答了串行任务可以转为并行任务,提高了系统效率,面试官说他认为这个是多线程的结果,而不是原因。遂跳过:有会的大佬可以评论区解答一下。
假设在你的RPC项目中,出现了大量的TIME_WAIT,可能的原因是什么?
答了消费端最后一个ACK可能由于网络丢失,这个复盘的时候感觉答的不太对。
实际上:
高并发短连接场景:服务器处理大量短时间的 HTTP 请求,每次请求结束后都会关闭连接,导致服务器端主动关闭大量连接。
服务器主动关闭连接:如果是服务器主动关闭连接(而不是客户端),那么 TIME_WAIT 会累积在服务器端。这在以下情况可能发生:服务端设置了 keep-alive 超时关闭服务端因为某些原因主动断开了长连接负载均衡策略导致服务器频繁关闭连接
连接池配置不当:如果应用使用的连接池配置不合理,可能导致频繁地建立和关闭连接。
没有开启 TCP 长连接:对于 HTTP 请求,没有配置 Connection: keep-alive
或相关设置,导致每个请求都建立新连接。
网络或应用层面的问题:客户端异常导致服务器必须主动关闭连接。
上面回答来自AI
还有些不记得了。
SQL题:
select id from table 1000,10;
select id from table 100000000,10;
id 为主键索引,这两句的查询效率?
答: 深度分页问题,可以采用分表措施,或者利用索引。
追问怎么利用索引?利用索引为什么可以提高查询效率?
怎么利用索引没答上来,后来发现可以加上where id > 的查询条件, 为什么可以提高查询效率? 经典八股。
手撕:
旋转数组的最小值
合并区间