首先聊到这个问题,其实主要是想要考察两个点:
其实从候选人的角度来看这个问题,大部分人一上来可能回懵逼的状态。平常很少涉及这个问题,一般平时只要知道怎么使用,了解一些其中比较重要的原理。根本很少去从全局的角度去考虑这个问题,想一些它背后的东西。类似这样的问题其实有很多,比如:如果让你设计一个Spring框架你会怎么做,让你涉及一个Dubbo RPC远程调用框架你怎么设计?让你设计一个MyBatis框架你会怎么去设计?这样的问题其实核心的点也不要你完全看过它核心的源码。只要你大致知道实现它的技术原理、核心技术组成、以及一些关键问题的解决思路是如何的。按着这种方式把链路串起来回答就好。
回答这个问题,大致可以从两方面来考虑:
MQ需要支持可伸缩性
,就是需要的时候可以快速扩容,这样能够更好的响应访问量激增,从而有一个更好的吞吐量和容量。要想达到这个需求,就需要设计一个分布式的系统,,可以参考Kafka的设计理念:broker -> topic -> partition。每个partition
放一个机器,就存放一部分数据。如果现在资源不够了,很简单,给topic增加partition,然后做数据迁移,增加机器,就可以提高的吞吐量了。MQ数据的持久化
,通俗一点讲就是把数据落盘,只有将MQ的数据持久化下来才能够保证MQ进程挂了数据不会丢失。同时还要考虑到落盘的方式
:要采用顺序写,这样才会没有磁盘随机读写的寻址开销的性能问题。顺序写同时也是Kafka的思路。多副本 -> leader & follower -> broker
broker挂了重新选举leader即可对外重新服务。通过以上几点我们就已经对设计一个自己的MQ有了一套比较简单系统化的方案。当然上述有很多设计的点是借鉴了Kafka的。具体Kafka对应实现的一个细节,如果感兴趣的小伙伴可以微信搜索【码上遇见你】关注后续的文章更新。