RabbitMQ/RocketMQ/Kafka 消息存储

RabbitMQ

RabbitMQ/RocketMQ/Kafka 消息存储_第1张图片

 

1.RabbitMQ的消息堆积模式为内存(不是绝对的,当内存不足时会出现换页现象)。所以,在生产者发生消息至Exchange,Exchange根据规则将消息在复制到匹配的队列中,所以每个Queue拥有所有的消息。

2.Exchange/Queue/msg 都可以分为临时和永久的。这个需要根据业务设置持久化方式。

3.对于Queue中的每个消息,只能被一个消费者消费。且无法回溯。

RocketMQ

RabbitMQ/RocketMQ/Kafka 消息存储_第2张图片

1.RocketMQ 的消息堆积模式为磁盘,堆积能力更强。 RocketMQ采用的单一的CommitLog文件进行消息存储(同一个broker的所有topic消息存储在一个文件)。同时通过consumeQueue 记录每个队列的消息的偏移量和物理地址。

2.commitLog生成规则:

    (1)文件的默认1G,超过这个值(或者其他因数),重新建一个日志

    (2)名字长度为20位,左边补零,剩余为起始偏移量。eg:

         00000000000000000000起始偏移量为0,

         00000000001073741824 起始偏移量为1073741824

3.consumeQueue规则:

     (1)名字长度为20位,左边补零,剩余为起始偏移量

     (2)每个Topic下的MessageQueue都会有一系列的ConsumeQueue文件, 在broker中的表现形式 dir/{topic}/{queueId}/{fileName},

     (3)每个ConsumeQueue文件保存30W条数据,大概每个文件5.72M(几乎可以完全被os缓存在内存cache中)。

4.记录格式

参考:https://www.cnblogs.com/zxporz/p/12336476.html

Kafka

RabbitMQ/RocketMQ/Kafka 消息存储_第3张图片

1.Kafka 的消息堆积模式为磁盘,堆积能力更强。 相对RocketMQ,Kafka的消息存储通过分区实现,每个分区有一个log文件 同时还有两个索引文件(偏移量索引文件 和 时间索引文件)

 2.文件规则  

    (1)文件夹 topic-partition, 主体+分区号

    (2)每个topic-partition 下存在多个分段日志(将大日志切分),每个分段日志包含一个log文件+两个索引文件(偏移量索引文件+时间索引文件)

    (3)日志名称由20位数字组成(消息偏移量做为文件名)

           000000000000000000000.log //消息日志

           000000000000000000000.index  //偏移量文件

           000000000000000000000.timeindex  //时间偏量文件

4.偏移量文件与消息日志的文件映射关系

RabbitMQ/RocketMQ/Kafka 消息存储_第4张图片

         

         能够快速查找消息的原因有:

        (1)偏移量文件保存是相对偏移量 + 消息日志的实际物理位置。

        (2)偏移量文件一般几兆的大小,可以完全加载到内存进行处理。

        (3)索引存储的偏移量是稀疏索引,可以通过范围查询和二分查快速定位消息的物理位置。

        (4) 无论是日志文件还是偏移量文件,系统都保持一定的大小,从而保证磁盘加载的速度。

 

Kafka与RocketMQ 存储的差异,对性能的影响

1.Kafka 每个分区的会有一个物理文件,而RocketMQ只有一个commitLog。

2.KafKa 这种存储方式,对于每个文件来说是顺序IO,但是当并发的读写多个partition的时候,对应多个文件的顺序IO,表现在文件系统的磁盘层面,还是随机IO。

3.当Topic数量增加时,消息分散的落盘策略会导致磁盘IO竞争激烈成为瓶颈。而RocketMQ所有的消息是保存在同一个物理文件中的,Topic和分区数对RocketMQ也只是逻辑概念上的划分,所以Topic数的增加对RocketMQ的性能不会造成太大的影响。

参考:http://jm.taobao.org/2016/04/07/kafka-vs-rocketmq-topic-amout/

总结

1.RabbitMQ 消息存储在内存

2.RocketMQ 消息存储在一个日志文件,队列只存储对应的消息偏移量

3.Kafka  消息分布存储在不同的分区,每个分区包含日志文件,偏移量文件及时间偏移量文件。

参考

1.狸猫技术窝 RocketMQ系列

2.《深入理解Kafka:核心设计与实践原理》

3.《RabbitMQ实战》

你可能感兴趣的:(MQ,RabbitMQ,RocketMQ,Kafka,MQ,消息存储)