今日头条Java面试技巧分享:写个消息中间件( 二 )


当然你要是说你全能 , 那当我没说 。
小结一下面试技巧首先要正确的看待面试官 , 你和面试官是同等的 , 不要一来就低声下气的 。
其次回答问题需要抓住重点 , 不要一股脑儿的把你知道的都说了 , 要留白待面试官提问 。
要把控面试的节奏 , 往自己熟知的方向上引 。
如何写个消息中间件接下来咱们再看看如何写个消息中间件 。
首先我们需要明确地提出消息中间件的几个重要角色 , 分别是生产者、消费者、Broker、注册中心 。
简述下消息中间件数据流转过程 , 无非就是生产者生成消息 , 发送至 Broker , Broker 可以暂缓消息 , 然后消费者再从 Broker 获取消息 , 用于消费 。
而注册中心用于服务的发现包括:Broker 的发现、生产者的发现、消费者的发现 , 当然还包括下线 , 可以说服务的高可用离不开注册中心 。
然后开始简述实现要点 , 可以同通信讲起:各模块的通信可以基于 Netty 然后自定义协议来实现 , 注册中心可以利用 zookeeper、consul、eureka、nacos 等等 , 也可以像 RocketMQ 自己实现简单的 namesrv (这一句话就都是关键词) 。
为了考虑扩容和整体的性能 , 采用分布式的思想 , 像 Kafka 一样采取分区理念 , 一个 Topic 分为多个 partition , 并且为保证数据可靠性 , 采取多副本存储 , 即 Leader 和 follower , 根据性能和数据可靠的权衡提供异步和同步的刷盘存储 。
并且利用选举算法保证 Leader 挂了之后 follower 可以顶上 , 保证消息队列的高可用 。
也同样为了提高消息队列的可靠性利用本地文件系统来存储消息 , 并且采用顺序写的方式来提高性能 。
可根据消息队列的特性利用内存映射、零拷贝进一步的提升性能 , 还可利用像 Kafka 这种批处理思想提高整体的吞吐 。
至此就差不多了 , 该说的要点说的都差不多了 , 面试官心里已经想 , 这人好像有点东西 。
今日头条Java面试技巧分享:写个消息中间件文章插图
之后可以深挖的点就很多了 , 比如提到的 Netty , 各种注册中心就能问很多 , 比如各注册中心之间的选型对比等 。
你还提到了选举算法 , 所以可能会问 Bully 算法、Raft 算法、ZAB 算法等等 。
你还提到了分区 , 可能会问这个分区和 RocketMQ 的队列有什么不同啊?具体分区要怎么实现?
然后你提到顺序写 , 可能会问为什么要顺序写啊?你说的内存映射和零拷贝又是什么啊?那你知道 RocketMQ 和 Kafka 用了哪个吗?(这些我都分析过 , 可以看 RocketMQ 和 Kafka 底层存储之那些你不知道的事)
当然还有可能问各种细节 , 比如消息的写入如何存储、消息的索引如何生成等等 , 来深挖看你有没有看过消息中间件的源码 。
可以问的还很多 , 这篇文章我也不可能每个点都延伸开说 , 这些知识点还是得靠大家日积月累和平日的多加思考 。
当然日后的文章可以写一写今天提到的一些点 , 比如 Netty、选举算法啊 , 多种注册中心对比啊啥的 。
面试官想问的是什么再回到这个面试题 , 其实面试官想问的就是大方向上的设计 , 包括整体的架构、数据的流转和一些特性的把握 , 所以对于这个问题他想听到的就是那些重点 , 而不是那些细节 。
而继续的深挖取决于你回答这个问题时提出的各个关键词 , 对于面试官自身而言熟悉的词一抓到 , 他就已经知道下一步要问你什么了 。
所以在回答面试官的时候不仅要 get 到他的点 , 还得为之后的回答铺路 , 不会说的点不要提 , 擅长的点多提提 。
最后之前我已经提到了 , 这篇文章的重点其实不在于如何回答写一个消息中间件 , 而在于面试的技巧 。
因为面试题千千万 , 而技巧掌握了那么千千万的面试题都适用 。
我还想提一下关于面试的一些个人看法 , 我个人是面试驱动学习型选手 , 我学习的动力就是面试 , 我享受面试官问我啥我都嘴角一翘微微一笑的那种不羁 。