kafka 的底层数据储存实现
- kafka 的数据是进行分区储存的,每一个分区对应单独的文件夹(数据,索引都是单独的),这样在并发(多生产者与消费者)读写的情况下性能更好(特别是读)
- 可以减少并发读写的冲突问题
- 在读的情况下,可以更好的使用批量读取的方式获取数据,提升读取性能
rocketMQ 的底层数据储存实现
- rocketMQ 的 index 的分开储存的,但是数据(message)是混合储存的,所有 topic 的所有分区的数据都是储存一起的.
- 这样使得 rocketMQ 在并发的条件下读写性能略逊一筹
- 并发写会有更多冲突
- 在读取的时候,每次需要通过索引映射数据,更加麻烦,不利于批量读取
为什么rocketMQ不使用分区分开储存而要使用混合储存的方式?
我没有在文档与书籍中看到为什么 rocketMQ 要使用混合储存的方式,但是我在探究他们的不同的时候发现 kafka 存在分区数量庞大(10000+)会导致性能下降的问题.
-
原因 1: zookeeper 维护了每一个分区的元数据(Brocker,group 等数据) ,当分区非常大的时候 zookeeper 压力比较大
-
原因 2:操作系统持有文件句柄数量是有限的,文件数量太多会导致性能下降
rocketMQ针对大topic支持的调整
-
调整中心节点: rocketMQ 使用的无状态的 nameserv 的模式,只储存他们的端口消息,不储存元数据,在大 topic 的情况下对中心节点的影响很小
-
采用混合储存的方式减少文件的数量(文件数量减少 1/3)
参考
https://blog.youkuaiyun.com/m0_37607945/article/details/144516423
https://kafka.apache.org/documentation/#introduction
https://rocketmq.apache.org/zh/docs/featureBehavior/01normalmessage
https://blog.youkuaiyun.com/m0_71513446/article/details/143386962
https://rocketmq-learning.com/faq/ons-user-question-history16752/