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

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

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

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

 

两种极端的情况

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

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

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

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

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

 

面试官也是人

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

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

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

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

 

正确的回答姿势

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

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

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

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

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

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

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

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

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

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

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

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

 

小结一下面试技巧

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

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

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

 

如何写个消息中间件

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

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

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

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

然后开始简述实现要点,可以同通信讲起:各模块的通信可以基于 Netty 然后自定义协议来实现,注册中心可以利用 zookeeper、consul、eureka、nacos 等等,也可以像 RocketMQ 自己实现简单的 namesrv (这一句话就都是关键词)。

为了考虑扩容和整体的性能,采用分布式的思想,像 Kafka 一样采取分区理念,一个 Topic 分为多个 partition,并且为保证数据可靠性,采取多副本存储,即 Leader 和 follower,根据性能和数据可靠的权衡提供异步和同步的刷盘存储。

并且利用选举算法保证 Leader 挂了之后 follower 可以顶上,保证消息队列的高可用。

也同样为了提高消息队列的可靠性利用本地文件系统来存储消息,并且采用顺序写的方式来提高性能。

可根据消息队列的特性利用内存映射、零拷贝进一步的提升性能,还可利用像 Kafka 这种批处理思想提高整体的吞吐。

至此就差不多了,该说的要点说的都差不多了,面试官心里已经想,这人好像有点东西。

之后可以深挖的点就很多了,比如提到的 Netty,各种注册中心就能问很多,比如各注册中心之间的选型对比等。

你还提到了选举算法,所以可能会问 Bully 算法、Raft 算法、ZAB 算法等等。

你还提到了分区,可能会问这个分区和 RocketMQ 的队列有什么不同啊?具体分区要怎么实现?

然后你提到顺序写,可能会问为什么要顺序写啊?你说的内存映射和零拷贝又是什么啊?那你知道 RocketMQ 和 Kafka 用了哪个吗?

当然还有可能问各种细节,比如消息的写入如何存储、消息的索引如何生成等等,来深挖看你有没有看过消息中间件的源码。

可以问的还很多,这篇文章我也不可能每个点都延伸开说,这些知识点还是得靠大家日积月累和平日的多加思考。

当然日后的文章可以写一写今天提到的一些点,比如 Netty、选举算法啊,多种注册中心对比啊啥的。

 

面试官想问的是什么

再回到这个面试题,其实面试官想问的就是大方向上的设计,包括整体的架构、数据的流转和一些特性的把握,所以对于这个问题他想听到的就是那些重点,而不是那些细节。

而继续的深挖取决于你回答这个问题时提出的各个关键词,对于面试官自身而言熟悉的词一抓到,他就已经知道下一步要问你什么了。

所以在回答面试官的时候不仅要 get 到他的点,还得为之后的回答铺路,不会说的点不要提,擅长的点多提提。

 

最后

之前我已经提到了,这篇文章的重点其实不在于如何回答写一个消息中间件,而在于面试的技巧。

因为面试题千千万,而技巧掌握了那么千千万的面试题都适用。

我还想提一下关于面试的一些个人看法,我个人是面试驱动学习型选手,我学习的动力就是面试,我享受面试官问我啥我都嘴角一翘微微一笑的那种不羁。

但是我不提倡那种纯粹背面试题的做法,学习是一个日积月累的过程,就像我每篇文末说的,从一点点到亿点点,又像我每篇开头都会提的,每个时代,都不会亏待会学习的人。

我的面试驱动不仅仅是说为了面试而学习,还要以面试场景来学习,什么意思呢?

学任何一种东西,都模拟一个面试官在你前面,让他从各种角度向你提问,驱动你全方位的理解一个知识点,这才是我说的面试驱动学习型选手。

所以如果你看过我之前的文章会发现我经常会提出为什么呢,然后再作答。

还有一点要注意,动手能力,这很关键。

Talk is cheap, show me the code。

有道无术,术可成;有术无道,止于术

欢迎大家关注Java之道公众号

好文章,我在看❤️

头条终面:写个消息中间件相关推荐

  1. 开源新作!抖音四面被拒,再战头条终获offer,一文搞懂

    前言 MySQL在过去由于性能高.成本低.可靠性好,已经成为最流行的开源数据库,因此被广泛地应用在Internet上的中小型网站中.随着MySQL的不断成熟,它也逐渐用于更多大规模网站和应用.非常流行 ...

  2. 抖音四面被拒,再战头条终获offer,在线面试指南

    现状 后端转 Android 我该从何处下手,现在学习 android 晚吗? 我的回答是晚还不至于,因为目前是市场趋于稳定正常,这个是市场发展的比如趋势,现在火爆大家都看好的人工智能,大数据,犹如2 ...

  3. GitHub重磅官宣!抖音四面被拒,再战头条终获offer

    一.内存与线程 1.内存结构 内存是计算机的重要部件之一,它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行,内存性能的强弱影响计算机整体发挥的水平.JVM的内存结构规定Java程序 ...

  4. 抖音四面被拒,再战头条终获offer,附架构师必备技术详解

    前言 "金九银十"的秋招热潮已经开始了,经过7月8月这两个月的提前批,终于成功拿下了一些大厂的offer.小编经过这么多次的面试,这两天整理了一份面试清单分享给大家,希望能给大家一 ...

  5. 抖音四面被拒,再战头条终获offer,系列教学

    本篇将由 环境搭建.实现原理.编程开发.插件开发.编译运行.性能稳定.发展未来 等七个方面,对当前的 React Native 和 Flutter 进行全面的分析对比,希望能给你更有价值的参考. 前言 ...

  6. 抖音四面被拒,再战头条终获offer,全套教学资料

    一.前言 关于开源框架这块,其实主要是针对自己项目中使用到的框架进行准备.从使用,到使用场景.优缺点以及源码实现都需要逐一掌握理解.这一部分是向面试官展示自己水平与能力的一个重要部分,所以要着重准备. ...

  7. 抖音四面被拒,再战头条终获offer,面试真题解析

    程序员与别的专业有所不同,其他专业都是越老越香,而程序员却是一个例外,因为计算机技术更新太快,而且工作强度很大,因此大部分程序员只会写 3 年代码.3 年后要不晋升做项目经理,要么转行,个别研究所除外 ...

  8. 自定义view仿写今日头条点赞动画

    前言 平时喜欢看今日头条,上面的财经.科技和NBA栏目都很喜欢,无意中发现他的点赞动画还不错,一下子就吸引到了我.遂即想要不自己实现一下. 最终效果对比如下: 头条: 仿写效果: 一.导读 学习的过程 ...

  9. python 今日头条 微头条_今日头条微头条范文-头条号的微头条你们都发些什么,该如何写?...

    头条号的微头条你们都发些什么,该如何写? 心灵相约头条号.呼唤着,努力着,拼搏着,它属于努力地人们,是传播正能量的家园.今天起要根扎头条号,写出优秀地原创作品.头条号的朋友们努力吧!用心血和汗水浇灌头 ...

最新文章

  1. libvirt 网络
  2. 实战 Windows 10 Microsoft Edge 中的多媒体投影功能
  3. 简单介绍VS2015自动测试工具
  4. shell 字符串切割
  5. 从一个表查询数据插入另一个表
  6. 九大背包问题专题--背包问题求具体方案数
  7. 微星刀锋 无法进入bios_只需一键!内存性能免费提升150%!微星AMDB550超频
  8. 两道动态规划的作业题
  9. K8S集群Calico网络组件报错BIRD is not ready: BGP not established with
  10. AlphaGo原理分析
  11. 协同编辑中使用的 OT 算法是什么?
  12. 傅里叶变换和正弦函数和欧拉公式
  13. wine - qq无法显示图片头像
  14. tushare接口get_realtime_quotes报错:AssertionError: 33 columns passed, passed data had 34 columns
  15. AcWing 138. 兔子与兔子
  16. [字符串题-java实现]20. 有效的括号
  17. 批处理判断操作系统的文件系统类型
  18. HTML插入空格 HTML多个空格 HTML实体
  19. 从“四舍五入”到“奇进偶舍”
  20. 【fake location破解版】加强版随风2.0定位助手使用方法

热门文章

  1. go语言接收html传值,Go语言参数传递是传值还是传引用
  2. oracle存储sql片段引入_强大的跨数据库访问组件 UniDAC使用教程:注释和SQL函数...
  3. js和python交互_JSShell:一个基于python的交互式Shell
  4. 数据结构之栈的应用:递归
  5. shell遍历文件夹
  6. python3单例模式
  7. 在Ubuntu 16.04 安装python3.6 环境并设置为默认
  8. 树:二叉树的非递归遍历算法
  9. 生活中要常常鼓励别人
  10. 团队任务2:冲刺前的准备