05|存储:消息数据和元数据的存储是如何设计的?
元数据信息的存储
- 深入了解
- 翻译
- 解释
- 总结
本文总结了消息队列存储模块的设计和实现要点。首先介绍了存储模块的主要流程,包括数据的写入、存储、读取和过期,以及元数据和消息数据的存储。然后详细讨论了数据存储结构设计、数据分段存储、数据存储格式和数据清理机制等方面的内容。文章还提到了消息队列的存储分为元数据存储和消息数据存储两方面,以及元数据存储依赖第三方组件实现,而消息数据存储在功能层面包含Topic和分区两个维度。最后,文章给出了开发新消息队列网络模块的思考路径,包括了解场景需求、分析业务形态、选择技术语言、实现网络模块等步骤。整体而言,本文内容丰富,涵盖了消息队列存储模块的设计和实现的方方面面,对于需要了解消息队列存储设计和实现的读者来说,是一份有价值的参考资料。
《深入拆解消息队列 47 讲》,新⼈⾸单¥59
全部留言(11)
- 最新
- 精选
- 勋老师您好,我问问,不理解dubbo和gRpc的区别,为什么不选dubbo,而是选gRpc作为RPC框架。 按我的理解 1. 序列化 1. dubbo默认采用java原生序列化框架、json序列化框架。 2. gRpc默认采用protoBuf框架,提高传输效率。 2. 语言支持 1. dubbo跨语言支持较弱。 2. gRpc支持多种语言。 3. 协议 1. dubbo支持多种协议,http协议、dubbo协议等 2. gRpc 默认为http2协议。http2协议支持NIO模式 问题: 为啥选gRPC而不是dubbo,dubbo也是基于NIO的多路复用的Reactor模型,也不差,是因为协议不高效、语言支持不够?还是其他原因,麻烦老师解答下。
作者回复: 从技术上来看,Dubbo肯定也能做,而且还有facebook的thrift等rpc框架也能做。技术上的差异,我们可以写出很多,比如你说的多语言,协议、性能等等,就先不展开。 但是我理解这个问题可以跳出技术的角度来看。 我会认为主要是社区影响力、技术生态丰富度、研发人员的认知接受度的差异。我认为主要是前两点。 GRPC当前可以说得业界RPC框架的代表了,业界接受度最高。此时带来的结果是,各个社区开源组件对GRPC的支持就很友好,比如Service Mesh,比如多个语言的SDK支持等等。 此时如果选择用GRPC 就会天然和社区的组件联通,减少了很多重复开发,对接的成本。有强强联合的效果。而如果用其他的组件,就会多很多对接、重复开发、客户适配的问题。
2023-07-05归属地:浙江5 - 张洋关于顺序写和随机写有一些问题?Kafka在分区特别多的时候,如果同时写的操作特别多的时候就有可能退化到随机写,但是RocketMq 在写数据的时候(如果Topic queue特别多的情况下)也要写索引文件(ConsumerQueue,IndexFile等等),虽然是定时刷新的,如果与数据文件同时写的情况下,也有肯能存在退化到随机写的可能,不过这种概率要比Kafka低的多不知道这样理解对吗?
作者回复: 你好啊~ 如果仅仅从文件数量的角度来看,就会认为可能有这个问题。但是生产环境中却很少会出现因为索引文件导致硬盘的压力多大的情况。原因是顺序写退化到随机写其实需要满足两个条件: 1. 文件数量很多。 2. 这些文件同时都有较大量的读写。 所以核心点在于文件的读写频率和读写数据量的差别。从技术上来看,索引文件不会产生这个问题主要有下面三个原因: 1. 索引文件的读写频率相对数据文件低很多,一般不会存在大量同时的读写。 2. 索引文件的数据量很小,即使大量读写,在短时间内就完成了,不会造成持续的压力。 2. 索引的数据因为数据量较小,一般会缓存到内存中,所以读写对硬盘的压力不大。 所以在大部分情况下,索引文件不会导致顺序写退化到随机写。但是从理论上看,非常极端的场景下是有这个可能的。
2023-07-21归属地:北京4 - 贝氏倭狐猴老师您好,咨询一个问题:原文“纵观业界主流消息队列,三种方案都有在使用,RabbitMQ 选择的是第一个方案,Kafka 和 RocketMQ 选择的是第二种方案,Pulsar 选择的是第三种方案。不同消息队列的方案选择,主要都是考虑架构设计和组件开发时业务场景的影响。我个人觉得第三种比较合理。”问题是kafka里新group不是也可以消费其他group已经ackknowledged的消息么?那是不是也是第三种方案呢?
作者回复: 你好啊,在我看来这里是有一种细微的差别的。以kafka为例: 1. 第二种方案,提交了offset后,还可以通过重置offset,来消费到之前消费过的数据。此时就有一种可能,就是客户端错误的重置了offset,此时就会出现重复消费消息的情况。这种场景在kafka里面经常会遇到,这也是kafka无法保证消费不重复的原因所在。 2. 如果第三种,当ack掉这个消息后,这个消费分组就无法再通过重置offset等操作来消费到已经消费过的数据。只要消息被ack,此时消息就永远(除非提供unack的功能)无法在这个消费分组被重复消费到。此时就避免了同一个消费分组的消息被重复消费的情况。从而提供了不重复消费的语义。 以上,就是我认为kafka是第二种方案的原因
2023-07-06归属地:江苏4 - Geek_8562b2老师,为什么Kafka分区过多会导致顺序读写变为随机读写
作者回复: 因为数据是写入到硬盘的。 如果同时有很多个文件在同时往硬盘去读写的话。从硬盘的角度来看的话,就是同时在硬盘的不同位置去读写,此时硬盘就得去调度不同位置的读写。即使是SSD和NVME的盘,这种在频繁的在硬盘不同位置的读写就是会降低性能。从硬盘角度来看,就是在不同位置的随机读写。
2023-07-11归属地:江苏23 - 张申傲每个分区独立一个文件存储,在分区数量较多时会退化成全局磁盘随机I/O,这也是Kafka在多Partition时吞吐量大幅下降的原因~
作者回复: 是的,技术上确实是这个原理,但是大部分情况下其实还好。 因为只有在很极端的情况,比如分区很多,并且都存在读写的场景才会触发。 在现网,做好运营的话,控制好单机的分区数,触发的概率不大。 - -
2023-06-30归属地:北京22 - 文敦复文中提到:(对所有分区公用1个单文件的情况下)缺点是同一个分区的数据一般会在文件中的不同目录。 这个“目录”是不是指文件不同位置的意思?
作者回复: 是的,这里的表达有点问题。我想表达的意思是”缺点是同一个分区的数据一般会在文件中的不同位置,或者不同的文件段中“。我修改一下,谢谢提醒~ 感谢感谢
2023-07-03归属地:四川 - 阳阳如果能添加实战的内容就更好了。
作者回复: 有这个规划的。我们先把理论讲完,理论扎实了,再一起来实战,效率会更高,效果也更好
2023-07-02归属地:中国香港 - aoeMQ 的 Topic、Partition 和 MySQL 的服务层、存储引擎层有点像
作者回复: 区别还是蛮大的,你可以先想想区别是什么。提示一下,可以从功能层面分析底层存储结构的区别
2023-06-30归属地:浙江2 - 翡翠虎存储部分,嗅到了一点 bitcask 的味道,感觉很接近
作者回复: 从工程的角度来看,消息队列是一个分布式存储系统。而分布式存储系统,底层的技术选型和设计要点其实是差不多的,有很多共性。只是形态和需求不一样,导致实现有差别。
2023-06-30归属地:广西 - 张申傲强哥讲的真好~2023-06-30归属地:北京2