Java面试-高并发-MQ自己设计一个(7)

Posted by 瞿广 on Wednesday, May 15, 2019

TOC

面试题 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路

1、面试官心里分析

其实聊到这个问题,一般面试官要考察两块:

(1)你有没有对某一个消息队列做过较为深入的原理的了解,或者从整体了解把握住一个mq的架构原理

(2)看看你的设计能力,给你一个常见的系统,就是消息队列系统,看看你能不能从全局把握一下整体架构设计,给出一些关键点出来

说实话,我一般面类似问题的时候,大部分人基本都会蒙,因为平时从来没有思考过类似的问题,大多数人就是平时埋头用,从来不去思考背后的一些东西。类似的问题,我经常问的还有,如果让你来设计一个spring框架你会怎么做?如果让你来设计一个dubbo框架你会怎么做?如果让你来设计一个mybatis框架你会怎么做?

2、面试题剖析

其实回答这类问题,说白了,起码不求你看过那技术的源码,起码你大概知道那个技术的基本原理,核心组成部分,基本架构构成,然后参照一些开源的技术把一个系统设计出来的思路说一下就好

比如说这个消息队列系统,我们来从以下几个角度来考虑一下

(1)首先这个mq得支持可伸缩性吧,就是需要的时候快速扩容,就可以增加吞吐量和容量,那怎么搞?设计个分布式的系统呗,参照一下kafka的设计理念,broker -> topic -> partition,每个partition放一个机器,就存一部分数据。如果现在资源不够了,简单啊,给topic增加partition,然后做数据迁移,增加机器,不就可以存放更多数据,提供更高的吞吐量了?

(2)其次你得考虑一下这个mq的数据要不要落地磁盘吧?那肯定要了,落磁盘,才能保证别进程挂了数据就丢了。那落磁盘的时候怎么落啊?顺序写,这样就没有磁盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是kafka的思路。

(3)其次你考虑一下你的mq的可用性啊?这个事儿,具体参考我们之前可用性那个环节讲解的kafka的高可用保障机制。多副本 -> leader & follower -> broker挂了重新选举leader即可对外服务。

(4)能不能支持数据0丢失啊?可以的,参考我们之前说的那个kafka数据零丢失方案

其实一个mq肯定是很复杂的,面试官问你这个问题,其实是个开放题,他就是看看你有没有从架构角度整体构思和设计的思维以及能力。确实这个问题可以刷掉一大批人,因为大部分人平时不思考这些东西。

消息队列总结:

一般而言,如果一个面试官水平还算不错,会沿着从浅入深的环节深入挖一个点。比如我吧,其实按照这个思路可以一直问下去,除了这里的7个问题之外,甚至能挑着你熟悉的一个mq一直问到源码级别非常底层。我还可能会结合项目来仔细问,我可能会先让你给我详细说说你的业务细节,然后将你的业务跟这些mq的问题场景结合起来,看看你每个细节是怎么处理的。

但是确实因为我们这个是面试突击型课程,不是什么kafka源码剖析课,也不是什么RocketMQ高并发架构项目实战课程,所以只能讲到这个程度。

所以我们这个课程只能让你从大面儿上,基本常见问题可以回答出来。基本上mq这块你能答到这个程度,你基本知识面儿是有了,但是深度是绝对没有的。所以如果一个面试官就问问这些问题,感觉你面儿上过的去了,那就恭喜你了。但是如果碰到我这种难缠的面试官,喜欢深挖底层,细扣项目细节的,那可能确实是不行的。

如果你碰到人家在7个问题之外还死扣着你问的,那你最好是认一下怂,就说你确实没研究那么深过,如果你面的就是个一般的职位,那可能就过去了。就我而言,如果招聘的就是个普通职位,而你能答到这个程度,那么就觉得说的过去了。毕竟说实话,相当大比例的程序员出去面java职位的时候,mq这块还回答不到这个程度呢。你能答好这些,至少比之前一无所知的你好了一些,也比很多没准备过的程序员都好了很多。

最后说一个技巧,要是确实碰一个面试官连这7个问题都没问满,只要他提到mq,你自己就和盘托出一整套的东西,你就说,mq你们之前遇到过什么问题,巴拉巴拉,你们的方案是什么,自己突出自己会的东西