写在后面
很多小伙伴去大厂面试,简直都会遇到一些开放式的题目,这些开放式的题目没有固定的答案,然而它可能实实在在的体现面试者较为实在的零碎设计能力和技术功底。如果你答复的比拟完满,那么,通过这种开放式题目,就可能让你从泛滥的面试者中怀才不遇。明天,咱们就一起来聊聊,去大厂面试时,一个较为常见的开放式题目:如果让你设计一个高并发的消息中间件,你会怎么做?
消息中间件波及的知识点
要想设计一个具备高并发的消息中间件,那么首先就要理解下消息中间件波及哪些具体的知识点。通常,设计一个良好的消息中间件起码须要满足如下条件:
- 生产者、消费者模型。
- 反对分布式架构。
- 数据的高可用。
- 音讯数据不失落。
接下来,咱们就针对消息中间件来别离谈谈这些技术点。
生产者消费者模型
置信很多小伙伴对于生产者和消费者模型都比拟理解了,简略的说:就是消息中间件可能使其余利用来生产音讯,也可能使其余利用来生产相应的音讯。
对于生产者和消费者模型,咱们须要思考的问题点就比拟多了。接下来,我就一步步来疏导大家进行思考。
首先,咱们来思考这样一个问题: 如果生产者生产了音讯,那么消息中间件应该怎么存储相应的数据呢?存储在内存?存储在磁盘?还是同时存储在内存和磁盘中呢?
如果是将音讯数据同时存储在内存和磁盘中,咱们又该如何解决这些数据呢?是生产者将音讯投递到消息中间件之后,咱们就立即将数据写入磁盘?还是说数据先驻留到内存,而后每隔一段时间刷到磁盘上?如果是每隔一段时间刷到磁盘上,那咱们又要思考磁盘文件的切分问题,也就是说,须要将音讯数据分成多少个磁盘文件?(总不能把所有的数据放到一个磁盘文件中吧)。如果是须要切分成多个磁盘文件,那切分的规定又是什么呢?
下面这些问题都是咱们在设计一个消息中间件时须要思考的问题。然而,这还只是一小部分问题。如果想在面试时怀才不遇,那就还须要持续往下看,还有一些重要的问题点须要留神。
如果文件依照肯定的规定切分到多个磁盘文件中了,那是不是还须要治理元数据来标识数据的具体音讯(就像是 Hadoop 中的 NameNode 节点中存储着 DataNode 的元数据信息,NameNode 节点通过这些元数据信息就可能更好的治理 DataNode 节点)?这些元数据能够包含:音讯数据的偏移量、也能够是音讯数据的惟一 ID。
思考完数据的存储问题,咱们还须要思考的是:消息中间件是如何将数据投递到对应的消费者的?
在设计生产者和消费者时,还一个很重要的问题须要咱们思考:咱们在设计消息中间件时,采纳的生产模式是什么?会不会将数据平均的调配给消费者?还是会通过一些其余的规定将数据投递到消费者?
反对分布式架构
如果咱们设计的消息中间件,每天会承载 TB 级别的数据高并发和高吞吐量的写入操作。这里,咱们就须要思考将消息中间件设计成分布式架构。
在设计分布式架构时,咱们还须要思考将存储的比拟大的数据,做成分片存储,对数据进行分片等操作。
除了这些,咱们还须要思考另外一个外围问题:对于消息中间件来说,须要反对主动扩容操作。
还有就是是否反对数据分片,如何实现数据分片的扩容和主动数据负载平衡迁徙等。
数据的高可用
个别互联网利用的高可用,是通过本地堆内存,分布式缓存,和一份数据在不同的服务器上都搞一个副原本实现的。此时,任何一个存储节点宕机,都不会影响整体的高可用。咱们在设计消息中间件时也能够参考这个思路。
音讯数据不失落
此时,咱们就须要提供手动 ACK 的机制,也就是说:当消费者真正生产音讯结束后,向消息中间件返回“解决实现”的标识,消息中间件删除相应的已解决的音讯。
然而,细化的话,这里,咱们就须要两套 ACK 机制:
- 一种 ACK 对应的是生产端。如果始终没有接管到 ACK 音讯,则须要通过生产者来从新发送一条音讯来保障生产音讯胜利。
- 另一种 ACK 对应的是生产端。一旦一条音讯生产并解决胜利,必须返回一个 ack 给消息中间件,而后消息中间件能力删除这条音讯。否则一旦消费者宕机,就必须重发这条音讯给其余的消费者实例,保障音讯肯定会被解决胜利。
明天,咱们没有聊具体的业务点,而是从整体上思考:如果实现一个消息中间件,须要咱们留神的各项知识点和专业技能!好了,明天就到这儿吧,我是冰河,咱们下期见~~