首先我们需要明确地提出消息中间件的几个重要角色,分别是生产者、消费者、Broker、注册中心。
简述下消息中间件数据流转过程,无非就是生产者生成消息,发送至 Broker,Broker 可以暂缓消息,然后消费者再从 Broker 获取消息,用于消费。
而注册中心用于服务的发现包括:Broker 的发现、生产者的发现、消费者的发现,当然还包括下线,可以说服务的高可用离不开注册中心。
然后开始简述实现要点,可以同通信讲起:各模块的通信可以基于 Netty 然后自定义协议来实现,注册中心可以利用 zookeeper、consul、eureka、nacos 等,也可以像 RocketMQ 自己实现简单的 namesrv (这一句话就都是关键词)。
为了考虑扩容和整体的性能,采用分布式的思想,像 Kafka 一样采取分区理念,一个 Topic 分为多个 partition,并且为保证数据可靠性,采取多副本存储,即 Leader 和 follower,根据性能和数据可靠的权衡提供异步和同步的刷盘存储。
并且利用选举算法保证 Leader 挂了之后 follower 可以顶上,保证消息队列的高可用。
也同样为了提高消息队列的可靠性 ,利用本地文件系统存储消息,并且采用顺序写的方式来提高性能。
可根据消息队列的特性利用内存映射、零拷贝进一步的提升性能,还可利用像 Kafka 这种批处理思想提高整体的吞吐。
之后可以深挖的点就很多了,比如提到的 Netty,各种注册中心,比如各注册中心之间的选型对比等。
而且还提到了选举算法,所以可能会问 Bully 算法、Raft 算法、ZAB 算法等。
还有提到了分区,可能会问这个分区和 RocketMQ 的队列有什么不同啊?具体分区要怎么实现?
然后提到顺序写,可能会问为什么要顺序写啊?内存映射和零拷贝又是什么啊?那你知道 RocketMQ 和 Kafka 用了哪个吗?
当然还有可能问各种细节,比如消息的写入如何存储、消息的索引如何生成等,来深挖看你有没有看过消息中间件的源码。