头条终面:写个消息中间件

每个时代,都不会亏待会学习的人。

大家好,我是 yes。

这种设计类问题想必大家都不陌生,面试时或多或少都能碰到。

比如如何写一个线程池?如何写一个 HashMap ?如何写一个 RPC 框架等等,当然这里的写不是真的叫你用代码写出来,只是说说设计理念,整体架构。

这个面试题来自于一个读者的字节面试经历,我会从面试技巧和消息中间件的设计两个方面阐述。

我觉得重点在于面试技巧,因为它通用。

两种极端的情况

大多数同学遇到这种问题会出现两种极端的情况:

第一种:一脸懵逼,两眼无神,不知从何说起,万般思绪,都化作一声叹息。

第二种:夸夸其谈,像是口中架起了一把加特林,哒哒哒哒哒哒哒哒,还冒着蓝火。

头条终面:写个消息中间件

第一种不用说了,好一点的面试官可能会引导你,会问一些提示性的问题,一步一步地带你渐入佳境,当然你要是胸中无点滴,那还是没救的,场面就异常地尴尬。

第二种会把面试官整蒙了,或许你真的懂很多,很多细节也都清晰,但是你不能一股脑儿的都抛出来,这会显得你抓不住重点。

面试官也是人

这点其实很关键,很多把面试官当成一个莫得感情的提问机器人,觉得他无所不能可以完全 get 到你的点,殊不知你引以为傲的细节回答,他可能觉得你在说蛇皮。

是人就会有感情,就需要交流,好的面试官会把控整体进度,从拉家常开始,让场子热起来再一步一步的深挖。

当然也有一些面试官比较弱,这时候就需要你来特意地流出一点空白,来让面试官涂鸦,让面试官感觉你这人就很舒服,你这波就稳了。

当然即使面对着把控全场的面试官你也得主动出击,每个人都有自己的擅长点,你需要引导面试官来询问你的长处。

正确的回答姿势

正确的回答姿势是 BFS(广度优先搜索) 而不是 DFS (深度优先搜索),什么意思呢?

就是我们需要先从大局上讲出需要设计的东西的重点,然后再等待面试官的继续提问,深挖

我们需要揣摩面试官的心理,从他的提问可以看出他想要知道的重点是哪个方向的。

比如就拿 HashMap 来说,你简单的把获取、写入、冲突处理、扩容啥的都说了,然后等待面试官接下来的提问,有可能会往线程安全方面深入,也有可能会往扩容方向再挖,比如引出 Redis 的 hash 扩容等等。

所以说给面试官留提问的机会,抓住他的喜好或者说熟知的方向回答,这样如果你答得好,相互之间谈的来,面试官会对你高度认可。

而且在说各设计要点的时候也要注意停顿,要留机会给面试官插话,让面试官充分参与你的设计

还是拿 HashMap 作为例子,比如你说了获取、写入、冲突之后稍作停顿,这时候大概率面试官还会问还有吗?让面试官有参与感,让他感觉经过他的引导这个设计才逐步地完善

头条终面:写个消息中间件

当然如果不问也没事,你停顿下继续说就行。

让面试成为一场技术交流,这是面试的最高境界,相信面试完了之后双方都会有意犹未尽的感觉,惺惺相惜就是这么来的。

但是这种场景也不是这么容易碰到的,首先你和面试官得有相同方向的喜好,比如你对 JVM 有很深入的研究,而面试官对存储方面有很深入的研究,JVM 懂的不深,这样就碰不出火花了。

所以说会有很多人碰到这么个情况:我面这个公司一面挂,另一家公司面面超神,这都是很正常的。

当然你要是说你全能,那当我没说。

小结一下面试技巧

首先要正确的看待面试官,你和面试官是同等的,不要一来就低声下气的。

其次回答问题需要抓住重点,不要一股脑儿的把你知道的都说了,要留白待面试官提问。

要把控面试的节奏,往自己熟知的方向上引。

如何写个消息中间件

接下来咱们再看看如何写个消息中间件。

首先我们需要明确地提出消息中间件的几个重要角色,分别是生产者、消费者、Broker、注册中心。

简述下消息中间件数据流转过程,无非就是生产者生成消息,发送至 Broker,Broker 可以暂缓消息,然后消费者再从 Broker 获取消息,用于消费。

而注册中心用于服务的发现包括:Broker 的发现、生产者的发现、消费者的发现,当然还包括下线,可以说服务的高可用离不开注册中心。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpyxwg.html