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