设计一个消息队列应该从以下 4 个角度考虑:
1. 可伸缩性:首先这个 MQ 得支持可伸缩性吧,就是需要的时候快速扩容,增加吞吐量和容量。
那怎么搞呢?设计一个分布式的系统呗,参照 kafka 的设计理念,broker-->topic-->partition,每个 partition 放一个机器,存一部分数据。如果现在资源不够了,就给 topic 增加 partition,然后做数据迁移,增加机器,这样就提供了更高的吞吐量。
2. 数据落盘:其次得考虑这个 MQ 的数据要不要落盘?那肯定要了,落盘才能保证进程挂了数据不会丢失。
那落盘的时候怎么落啊?顺序写,这样就没有落盘随机读写的寻址开销,磁盘顺序读写的性能是很高的,这就是 kafka 的思路。
3. 可用性:再者得考虑 MQ 的可用性,像 kafka 的高可用保障机制,可以设置多副本方式,当 leader 挂了可以重新选举 leader。
4. 可靠性:设计 MQ 要想能不能支持数据 0 丢失?我们可以设置 MQ 的可靠性,保障数据不会丢失。如何保证消息的可靠性,避免消息丢失