写点什么

【大厂面试真题解析】蔚来数字化业务后端一面(2022.8.6)

作者:面试官问
  • 2022 年 8 月 09 日
    广东
  • 本文字数:2328 字

    阅读完需:约 8 分钟

【大厂面试真题解析】蔚来数字化业务后端一面(2022.8.6)

关于我:微信公众号:面试官问,原创高质量面试题,始于面试题,但不止于面试题。**【大厂面试真题解析】**面试系列文章将会对大家实际面试中遇到的面试题进行汇总分析,以飨读者。


本文是 作者 近期面试蔚来数字化业务被问到的问题,本文节选了其中通用的部分进行了解析,欢迎读者将面试中遇到的问题私信我,可以帮大家整理出回答的要点。

1. 介绍下你做过的项目

根据简历中列举的项目,面试官会挑选你近期做过的或者他比较感兴趣的项目让你做比较细致的介绍,同时他会记录项目中的关键技术点,后面会进行提问。这个就需要你好好复盘总结自己的项目,做到心中有数。

2. RPC 注册中心 ZooKeeper 挂掉了怎么办?

ZooKeeper 通常作为 RPC 框架 Dubbo 的注册中心使用,保存了服务名和 ip 地址之间的映射关系。而 ZooKeeper 本身是一个 CP 系统,因为当 Leader 节点挂了,它会进行投票选举,这时 ZooKeeper 是无法对外提供服务的(不可用)。因此,当 ZooKeeper 集群挂掉了,微服务是无法访问它的,但这时,微服务间依然可以进行 RPC 通信,因为 Dubbo 会将这个映射关系缓存在每个服务实例的本地,可以选择缓存在服务内存中,或者本地文件中。


关于 RPC 和 ZooKeeper 的联系,可以看下这篇文章:《手写了一个RPC框架》

3. Netty 里面的 bossgroup 和 workergroup 分别是干什么的?

Netty 服务端在处理连接请求时,有 2 个线程池,分别是 bossGroup 和 workerGroup,其中 bossGroup 负责处理 IO 的 Accept 事件,接收远程客户端的连接;而 workerGroup 处理已连接的客户端的 IO 读写。其实这就是经典的主从 Reactor 线程模型的应用。

4. 为什么要用 NIO?

NIO 相比 IO 而言,是非阻塞的 IO 编程模式,而且提供了 IO 多路复用能力。如果使用传统的阻塞 IO 编程模式来实现网络服务器,那么服务端需要为每个客户端请求都创建一个线程进行请求的处理,在高并发场景下,会给服务端带来严重的性能问题;而使用 NIO 的多路复用功能,我们可以实现主从 Reactor 线程模型,通过维护两个线程池来处理客户端的请求,更好的支持系统的高并发。


主从 Reactor 线程模型如下图所示,更详细的说明可以参见极客时间的这篇文章: 《07 | NIO:手撸一个简易的主从多Reactor线程模型》


5. Spring Bean 的生命周期?

普通的 Bean 是开发者自己创建和维护的,Spring Bean 是托管给容器进行维护的,也就是由容器来管理它的生命周期,完整的 Spring Bean 的生命周期还是挺复杂的,面试中我相信你也不可能都给背诵下来,即使背诵下来,其实意义也不大,最关键还是要有自己的理解。


Spring Bean 的生命周期全过程分为 5 个阶段,创建前准备阶段、创建实例阶段、依赖注入阶段和容器缓存阶段以及销毁实例阶段。

6. Bean 对象怎么拿到 ApplicationContext

ApplicationContext 是 Spring 中的高级容器,可以获取容器中的各种 Bean 组件,注册监听事件,加载资源文件等功能。一般推荐实现 ApplicationContextAware 接口来获取 ApplicationContext

7. Redis 里的基本数据结构,具体有什么应用?

Redis 有五种常用的基本数据类型,对应的使用场景举例如下:


  • 字符串 String:实现不同微服务实例之间 session 共享,分布式锁、ID 生成器、计数器、限速器等

  • 列表 List:实现消息队列功能,缓存文章列表信息等

  • 哈希 Hash:用于缓存用户信息 UserInfo(可能包含 userId、userName、password、email 等字段)、实现短网址生成程序等

  • 集合 Set:存储用户的标签信息、唯一计数器、点赞等功能

  • 有序集合 ZSet:实现排行榜、时间线等功能

8. Redis 中 Hash 数据类型怎么实现购物车的?

Redis 的 Hash 数据类型可以很容易实现购物车的相关操作,如下图所示。其中 cart:10001 假设是用户 id 为 10001 的用户购物车 key,10067 假设是某个商品 id。



关于电商相关系统设计的更多信息,可以参见这本开源的手册:《电商设计手册 | SkrShop》

9. 粘包半包问题是如何产生的?是如何解决的?

TCP 传输协议是面向流的,没有数据包界限。客户端向服务端发送数据时,可能将一个完整的大报文拆分成多个小报文进行发送和接收,也可能将多个小报文合并成一个大的报文进行发送和接收。因此就有了拆包和粘包。


在网络通信的过程中,每次可以发送的数据包大小是受多种因素限制的,如 MTU 传输单元大小、MSS 最大分段大小、滑动窗口等。如果一次传输的网络包数据大小超过传输单元大小,那么我们的数据可能会拆分为多个数据包发送出去。如果每次请求的网络包数据都很小,一共请求了 10000 次,TCP 并不会分别发送 10000 次。因为 TCP 采用的 Nagle 算法对此作出了优化。


由于拆包/粘包问题的存在,数据接收方很难界定数据包的边界在哪里,很难识别出一个完整的数据包。所以需要提供一种机制来识别数据包的界限,这也是解决拆包/粘包的唯一方法:定义应用层的通信协议。主流的解决方案有三种:


  • 固定每个报文的消息长度

  • 使用特定分隔符分隔不同报文,Redis 在通信过程中采用的就是换行分隔符

  • 基于消息长度+消息内容的变长协议,Dubbo、RocketMQ 等都基于该方法自定义了自己的通信协议


更多关于粘包/拆包问题的信息详细介绍可以参考: 《06 | 粘包/拆包问题:如何获取一个完整的网络包?》《面试突击70:什么是粘包和半包?怎么解决?》

10. MySQL 里面有哪些锁?分别是做什么用的?

加锁是为了保证数据的一致性,MySQL 的锁从不同的角度有多种划分,总的来说如下图所示:



关于 MySQL 锁更详细介绍可以参考极客时间的这篇文章:30丨锁:悲观锁和乐观锁是什么?

11. TCP 是哪一层的?Http 是哪一层的?WebSocket 是哪一层的?

TCP 是传输层协议,HTTP 和 WebSocket 都是应用层协议。

12. 手撕代码:请编程实现 LeetCode 207. 课程表

这个大家可以先看官方题解,后续面试官问公众号也会发布对应的题解,敬请期待。

发布于: 刚刚阅读数: 5
用户头像

面试官问

关注

公众号:面试官问 2017.10.20 加入

还未添加个人简介

评论

发布
暂无评论
【大厂面试真题解析】蔚来数字化业务后端一面(2022.8.6)_后端_面试官问_InfoQ写作社区