楼主才疏学浅,如果有问题,请及时在下面留言
相比其他面经而言,我讲了一个follow up的例子,看一下如何在一个问题让面试官对你印象深刻?
简介
楼主双非本科,无大厂实习经验。项目就是烂大街的秒杀项目,面试时基本上被所有的面试官忽略了.........我这简历基本上很难过,最后也是被滴滴捞了一下,部门是网约车平台,岗位是后端研发工程师。
许愿早日OC以及意向书.....
所以没有项目就要做好被面试官死怼基础的准备了!!!!基本上就是源码或者底层原理的设计。
在看下面面经之前,我想说一些关于面试事情:
- 我的面经问题相比别人特别少,一个很大原因是我一直在面试时follow up,基本上不需要面试官问我,我都已经顺便给讲完了(follow up这个我一会解释)
- 我的面试问题其实跟大多数人差不多,甚至社招都在问这些问题。但是同样的问题,回答出正确答案可能只需要3句话,但是差距就在于你自己的理解或者说对这个问题的思考有多深,最后能答出几十句话(看下面的follow up)
- 简历上面的必问!!!简历上面的必问!!!简历上面的必问!!!简历上面的必问!!!不是简历上的,没答上还能勉勉强强,如果简历上面的答不上来,就GG了
关于follow up,是对面试问题的回答的一个延伸,切忌不要给自己挖坑,而是引导面试官问一些问题。
举个例子:
面试官:说说如何保证RocketMq消息不丢失?
正常回答:RocketMq提供了一种同步刷盘机制,当消息保存到磁盘上时,才会返回给生产者发送成功。
大神回答:
除了这个刷盘机制,还提供一种异步刷盘机制,消息保存在缓存中,采用异步的方式刷新到磁盘上,可能会出现消息丢失的情况,但是该刷盘机制相比于同步刷盘QPS有很大的提升。(Redis也有类似的刷盘的策略,如果您想听,我想等我讲完给您讲讲这个)
但是我在实际的项目中还是采用的同步刷盘机制,来保证消息一定不丢失。
因为在RocketMq中做了两点的优化来提高QPS
- 消息存储(顺序写):RocketMQ的消息用
顺序写
,保证了消息存储的速度。目前的高性能磁盘,顺序写速度可以达到600MB/s, 超过了一般网卡的传输速度,但是磁盘随机写的速度只有大概100KB/s - 消息发送(零拷贝):将本机磁盘文件的内容发送到客户端需要进行多次复制,比如从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;从用户态内存复制到网络驱动,最后从网络驱动复制到网卡中。RocketMq采用Java中零拷贝的技术,让从内核态内存复制到用户态内存这一步省略,直接赋值到网络驱动中
- 消息存储(顺序写):RocketMQ的消息用
除此之外,RocketMq消息选择保存到了磁盘,而ActiveMQ默认采用的KahaDB做消息存储,这是一种关系数据库。采用文件系统的除了RocketMq还有Kafka/RabbitMQ
由于,普通关系型数据库(如Mysql)在单表数据量达到千万级别的情况下,其IO读写性能往往会出现瓶颈,而且关系型数据库如果出现了宕机或者损坏,就会导致Mq不可用。
RocketMq选择文件系统,是因为做了一些刚才说的优化,所以读写性能上,比关系型数据库会有很多优化;而除非磁盘发生损毁,消息是不会损毁的。
(我想继续给您将一下RocketMq的文件系统,您看可以吗?如果可以,继续....)
RocketMQ消息的存储是由ConsumeQueue和CommitLog配合完成的
CommitLog
:消息真正的物理存储文件是CommitLog,默认一个文件一个G,存储的是Topic,QueueId和Message,一个存储满了会自动创建一个新的。ConsumeQueue
:是消息的逻辑队列,类似数据库的索引文件,存储的是指向物理存储的地址,为了加快消息的读取速度。消费者消费某条消息时,先查询索引获取CommitLog的对应的物理地址。每个Topic下的每个Message Queue都有一个对应的ConsumeQueue文件,文件很小,通常会加载到内存中。如果该文件丢失或者损坏,可以通过CommitLog恢复IndexFile
:也是个索引文件,为了消息查询提供了一种通过key或时间区间来查询消息的方法,这种通过IndexFile来查找消息的方法不影响发送与消费消息的主流程
(别忘了前面还想着给面试官讲讲Redis呢,记得问一下他还想不想听了)
上面这些,讲个十来分钟还是没有问题的,如果很厉害的话,顺便可以对比一下MySQL的磁盘存储,这点我不太熟悉。如果是社招,我觉的多讲一下自己在实际中的应用,说个20-30分钟都不是问题
至于四面那个Redis的Hash数据结构源码,我是对比着Java的HashMap说的,讲完都快20分钟了。如果问索引或者SQL优化,在不打断的情况下,感觉能说个30分钟。
楼主的博客已经完成部分内容的总结:https://blog.nowcoder.net/xzzz2020
如果觉得可以,楼主会完成接下内容的总结,记得点赞以及收藏面试专栏哦,都是来源于网上开源项目以及博主自己的理解,这是楼主自己搭建的博客:https://xzzz2020.gitee.io/
如果觉得这个follow up的思路讲的可以,希望可以在下面回复一下,这样帖子就不会沉了,可以让更多的人看到
一面(30min)
Redis
- 主从复制的架构
- 主从复制底层原理
- Zset的跳跃表(将这个的时候,顺便对比了平衡树树,包括一些实现源码最后也说清楚)
手写SQL(不会)
手写算法题:
- 给一串数组,一个整数,判断有连续几个比整数大,连续几个比整数小
二面(50min)
RocketMq
- 如何保证消息不丢失
Redis
- 水平扩展的底层原理
JVM
GC的语言会有内存泄漏的问题吗?
什么时候会内存泄漏
GC对程序的影响在哪(说了fullGC)
高并发
- 线程池都有哪些(提一下阿里巴巴的规范)
- ThreadLocal都用在哪些场景
集合
- LinkedList是双向链表还是单向的
- HashMap和treeMap的区别?
手写算法
给100个篮球,放进10个不同的框子里,有几种方案?(深搜和DP我都写了)
问了看过那些源码?
- Redis、Spring、RocketMq、Java集合
问了CAP理论(不会,简历没写)
问了Netty(不会,简历没写)
问了职业规划
三面(70min)
三面应该更多考察实际的能力,面试官很和蔼,就相当于在闲聊。这一面答的很烂,很多操作系统的东西不知道,智力题也没算正确....差点以为挂了
都看过哪些书,最推荐那本?
网络都分几层,都有哪些协议,分别在哪些层?
自己有服务器吗?为什么要整个服务器?
自己用的什么系统的电脑?
为什么不考研?
聊了聊项目都解决了什么问题,我是怎么解决的。
进程和线程的区别?
进程分配的内存空间有限制吗?
线程分配的地址xxx的(不会)
时钟和分针下一次重合的时间(算了很久没算出来,说了下思路)
Redis的端口号,用的什么协议,都用过什么东西连接的Redis
都知道哪些消息队列,都有什么区别?
项目都解决了什么问题,怎么解决的?
为什么操作系统端口号有限制?
一个Windows的程序能在Linux程序运行吗?
JDK和JRE的区别?
四面(60min)
第一个算法是给一个数组,假如[1,2,3,4],该数组求和为10,让返回一个数组[10-1,10-2,10-3,10-4],第一个数组求和减去对应位置。限制是不允许用减号。
第二个算法是计算根号三,精度不限,要求运行出结果。
最后还剩了点时间,就简单考察了一下基础,问了我Redis的源码,问的是Hash的数据结构。
最后就让我问问题,跟我闲聊问我有没有考研的想法以及都面了哪些公司了。面试官很好,后面安慰了我学历不好没关系,让我在自己能把握的地方做好就行。
HRBP面试(30min)
我投的牛客SP专场,用的牛客的简历,忘记改了,上面全是坑.....
问了我对滴滴的看法
问我北京那么多公司
哪些公司算是一线公司
问我如果阿里腾讯给我offer,我会选择哪个
问了北京那么多公司,哪些公司在我眼里是一线互联网公司
问我为什么要做我简历的项目
问我家人和女朋友支持来北京吗
什么样的人在我眼里是大佬?
问我会c++嘛
愿意用c++写程序嘛
问我性格的缺点
问我竞赛中一次当leader的感受和收获
问我为什么要发表出租车相关的论文
问我为什么要举办我们学校第一届建模队
如何选择下一届建模的队长
还有就是问我喜欢滴滴什么地方
感觉很在意我作为一个leader的表现,很不想提,不想让hr感觉我喜欢管人.....
没有问我对评级的想法,我自己主动问了我的评级,没给我说。
最后许愿希望早日OC,早日收到滴滴的意向书!!!!码字不易,希望可以让更多人看到.....
全部评论
(18) 回帖