面试题:如何设计一个消息队列?

作者:yanglbme 来源:https://github.com/doocs/advanced-JAVA/blob/master/docs/high-concurrency/mq-design.md

面试题:如何设计一个消息队列?

文章插图
 
# 面试官心理分析
 
其实聊到这个问题 , 一般面试官要考察两块:
 
1、你有没有对某一个消息队列做过较为深入的原理的了解 , 或者从整体了解把握住一个消息队列的架构原理 。
 
2、看看你的设计能力 , 给你一个常见的系统 , 就是消息队列系统 , 看看你能不能从全局把握一下整体架构设计 , 给出一些关键点出来 。
 
说实话 , 问类似问题的时候 , 大部分人基本都会蒙 , 因为平时从来没有思考过类似的问题 , 大多数人就是平时埋头用 , 从来不去思考背后的一些东西 。类似的问题 , 比如 , 如果让你来设计一个 Spring 框架你会怎么做?如果让你来设计一个 Dubbo 框架你会怎么做?如果让你来设计一个 MyBatis 框架你会怎么做?
 
# 面试题剖析
 
其实回答这类问题 , 说白了 , 不求你看过那技术的源码 , 起码你要大概知道那个技术的基本原理、核心组成部分、基本架构构成 , 然后参照一些开源的技术把一个系统设计出来的思路说一下就好 。
【面试题:如何设计一个消息队列?】 
比如说这个消息队列系统 , 我们从以下几个角度来考虑一下:
 
首先这个 mq 得支持可伸缩性吧 , 就是需要的时候快速扩容 , 就可以增加吞吐量和容量 , 那怎么搞?设计个分布式的系统呗 , 参照一下 kafka 的设计理念 , broker -> topic -> partition , 每个 partition 放一个机器 , 就存一部分数据 。如果现在资源不够了 , 简单啊 , 给 topic 增加 partition , 然后做数据迁移 , 增加机器 , 不就可以存放更多数据 , 提供更高的吞吐量了?
 
其次你得考虑一下这个 mq 的数据要不要落地磁盘吧?那肯定要了 , 落磁盘才能保证别进程挂了数据就丢了 。那落磁盘的时候怎么落啊?顺序写 , 这样就没有磁盘随机读写的寻址开销 , 磁盘顺序读写的性能是很高的 , 这就是 kafka 的思路 。
 
其次你考虑一下你的 mq 的可用性啊?这个事儿 , 具体参考之前可用性那个环节讲解的 kafka 的高可用保障机制 。多副本 -> leader & follower -> broker 挂了重新选举 leader 即可对外服务 。
 
能不能支持数据 0 丢失啊?可以的 , 参考我们之前说的那个 kafka 数据零丢失方案 。
 
mq 肯定是很复杂的 , 面试官问你这个问题 , 其实是个开放题 , 他就是看看你有没有从架构角度整体构思和设计的思维以及能力 。确实这个问题可以刷掉一大批人 , 因为大部分人平时不思考这些东西 。




    推荐阅读