消息队列的存储

kafka的存储以partition为单位,每个partition包含一组消息文件(Segment file)和一组索引文件(index),并且消息文件和索引文件一一对应,具有相同的文件名(扩展名不同),文件名就是这个文件中第一条消息的索引序号

每个索引中保存索引序号(这条消息在这个分区中的第几条消息)和对应的消息在消息文件中的绝对位置。kafka采用的是稀疏索引,为了节省存储空间,不会为每条消息都创建索引,而是每隔几条消息创建一条索引

写入消息:在消息文件尾部连续追加写入
查找消息:首先根据文件名找到所在的索引文件,再用二分法遍历索引文件内的索引,找到距离目标消息最近的索引,再去消息文件中,找到这条索引指向的消息位置,从这个位置开始顺序遍历消息文件,找到目标消息

RocketMQ的存储以broker为单位,存储也分为消息文件和索引文件,但是在每个broker中的消息文件中保存着这个broker上的所有主题的消息。索引文件和kafka一样,是按照主题和队列分别建立的,每个队列对应一组索引文件,这组索引文件在rockerMQ中被称为consumerQueue,RockerMQ中的索引是定长稠密索引,为每条消息都简历索引,每个索引的长度都是的固定的20个字节

写入消息:broker上所有主题、所有队列的消息按照自然顺序追加写入到同一个消息文件中,一个文件写满写下一个。
查找消息:根据队列的消息序号,计算出索引的全局位置(索引序号*20),然后读取这条索引,再根据索引中记录的消息的全局位置,找到消息。查找比kafka快。

对比:
1、kafka很容易进行数据迁移和扩容;rocketMQ在写入的时候,同时写入的文件更少,有更好的批量(不同主题和分区的数据可以组成一批一起写入),更多的顺序写入,尤其在broker上有很多主题和分区的情况下,有更好的写入性能。
2、索引设计上,rocketMQ和kafka分别采用了稠密和稀疏索引,稠密索引需要更多的存储空间,但查找性能更好,稀疏索引能节省空间,但查找慢
3、在broker上有上千个主题,RocketMQ的写入性能更有优势;消息的数量很多,每条消息都很小,kafka的稀疏索引能节省很多存储空间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值