当前位置: 首页 > 面试经验 >

菜鸟补录面经(已oc)

优质
小牛编辑
88浏览
2023-12-26

菜鸟补录面经(已oc)

一面&二面

一面二面比较类似,我就放在一起讲了。上来先是自我介绍。自我介绍结束的时候,面试官让我谈谈自己最拿手的一个项目。

我展开说了一下,用了哪些技术栈、怎么用的,做项目的时候遇到了哪些问题,后面的解决方案是怎么样的。 这之后,面试官根据我之前的描述,开始进行提问:

Q:你这边项目用到了Netty,你能说一说为什么要用Netty么?

需要保持长连接的规模比较大,自己写连接、连接池之类的做管理可能会比较麻烦。Netty提供了非常多好的特性,也是现在大家使用最广泛的框架,社区也比较活跃,相对而言可靠性、Bug修复速度等都会更优

Q:你刚才说到Netty提供了非常多好的特性,你可以说说有哪些么

首先是Netty封装了Java原生的NIO类,相比较Java原生的NIO类,使用起来更方便;其次是它支持很多编码协议,也支持自定义的编码,和我这个项目的需求也很贴合;然后Netty通过非阻塞的IO模型以及它的Reactor线程模型、内存池设计以及零拷贝的一些特性都能够提升它的并发量。官方宣称的并发量有100W,对于我这个项目而言还达不到那么高的并发数量级,所以完全够用。

Q:你能说说Netty的Reactor线程模型是怎么做的么?

讲了一下单Reactor单线程模型、单Reactor多线程模型、主从Reactor模型,以及简单分析他们的优缺点和适应场景

Q:说一说Socket和WebSocket有什么区别

我根据自己的理解,认为Socket是一组API,是从TCP层抽象出来的,而WebSocket是一种类似于Http协议之类的应用层协议(不知道对不对)

Q:你是怎么解决粘包和拆包的问题的?

Netty本身提供了线程的解决方案,并且做了封装。Netty可以根据换行符切割报文,根据固定长度切割报文,根据数据包长度切割报文,也可以通过自定义分隔符符号来切割报文。对于我这个项目而言,是使用自定义分隔符符号来做切割的。使用的时候因为Netty是使用责任链模式做的,只需要直接使用.addLast导入即可。

Q:你这边使用WebSocket来保持长连接,为什么不用其他协议,比如TCP、UDP、MQTT?

首先UDP直接就被排除了,它只保证尽最大可能交付,像视频场景用UDP可以适用,在项目中我要保证每一条数据都能够被正常接收。然后服务器在收到报文之后还要能够给设备有一个确认,因此需要一个全双工通信的机制,因此排除了TCP。至于为什么不用MQTT,一个是因为之前没了解过这个协议,另一个原因就是一开始接到这个项目的时候我就觉得用Socket来做很合适,然后和之前做过类似项目的师兄讨论了一下之后,决定用WebSocket。

Q:你之前说如果自己来写Socket控制连接的话会用到线程池,你有用过么?

没有,了解一些

Q:有哪些创建线程的方法?

继承Thread类创建线程、实现Runnable接口来创建线程、通过Callable和FutureTask创建线程、通过线程池创建线程。

Q:那你可以说一说,要使用线程池的话需要用到哪些参数么?

首先要用线程池需要知道上下文(ACC),然后需要知道核心线程数量(corePoolSize)和最大的线程数量(maximumPoolSize),然后是等待队列(workQueue)、非核心线程空闲时间(keepAliveTime),最后是一个线程的创建工厂(threadFactory)和拒绝策略(handler)

Q:线程的数量怎么确定比较合适?比如现在有一个IO密集型的应用和一个CPU密集型的应用,你会怎么确定线程的数量?

IO密集型的线程数量我觉得可以设置得大一些,比如设置为两倍或者更多的cpu核心数,CPU密集型的话选择的线程数会和CPU核心数接近。

Q:你这样设计的理由是什么

IO密集型的任务,在数据准备的过程中CPU是处于空转状态,这个时候可以把CPU时间片分出去给其他线程使用;而CPU密集型任务CPU一直在工作,即使设置更大的线程数,也没有多余的核心来分配给其他线程使用。

Q:在数据库中应该都用到过索引,你可以说一下MySql为什么要用B+树实现索引,而不是别的数据结构,比如哈希、B树、AVL树

首先B+树是一颗平衡树,每个叶节点到根节点的长度相同,这样可以提升查找效率;其次B+树所有关键字节点都在叶子结点上有序存放,且通过双向链表连接,方便了范围查询;B+树的非叶节点不存储数据,因此可以存放更多的索引数据。B+树的节点大小固定,有利于磁盘预读。

为什么不用Hash、B-Tree、AVL理由也是从为什么用B+树的角度简单回答了一下。

Q:聚簇索引和非聚簇索引有什么区别?

聚簇索引中叶节点存放的数据是一行数据,如果是通过非聚簇索引进行查找,查找的结果是想要查询的那一条数据的主键,需要一次回表之后根据主键再一次查找。

Q:有没有遇到过慢查询的情况,你是怎么解决的?

没遇到过。。

Q:那你认为可能是什么原因引起的?

索引失效、查询语句没遵循最左匹配原则、索引的区分度不高、网络故障。。

简单小结

一面时间在35分钟左右,和笔试是一起做的,手写LRU(写完之后介绍一下实现的逻辑)。面试结束收到测评。测评结束后第二天收到二面邀约

二面时间在45分钟左右,面完第二天约的HR面。

hr面

自我介绍,问了项目情况,因为项目我全程跟,从前期需求对接到中期审查、试运行、结项都是我再负责。hr问的问题比较普遍吧,一个是项目中遇到了什么难点,怎么解决的。然后怎么和他们沟通的,沟通的时候遇到什么问题,怎么解决的。这一块聊得蛮久的。

OC

HR面结束当天OC,第二天收到正式意向

暂时回忆起这些,如有补充后续会继续在本贴更新

#晒一晒我的offer##阿里##菜鸟##菜鸟秋招##秋招#
 类似资料: