深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

05|存储:消息数据和元数据的存储是如何设计的?

你好,我是文强。今天我们讲消息队列的存储模块。
存储模块作为消息队列高吞吐、低延时、高可靠特性的基础保证,可以说是最核心的模块。从技术架构的角度来看,存储模块包含功能实现和性能优化两个方面,我们今天先聊存储模块的功能设计和实现。
上节课我们讲过,存储模块的主流程是数据的写入、存储、读取、过期。读写、持久化存储是基本功能,但因为消息队列独有的产品特性,主要被用来当缓冲分发,它的数据存储是临时的,数据持久化存储后,在一定的时间或操作后,需要能自动过期删除。
那对于消息队列这样有特殊需求的存储模块,我们在实现功能的时候要注意哪些事情呢?带着这个问题,我们开始今天的学习。
首先,一个前置信息你要清楚,消息队列中的数据一般分为元数据和消息数据。元数据是指 Topic、Group、User、ACL、Config 等集群维度的资源数据信息,消息数据指客户端写入的用户的业务数据。下面我们先来看元数据信息的存储。

元数据信息的存储

元数据信息的特点是数据量比较小,不会经常读写,但是需要保证数据的强一致和高可靠,不允许出现数据的丢失。同时,元数据信息一般需要通知到所有的 Broker 节点,Broker 会根据元数据信息执行具体的逻辑。比如创建 Topic 并生成元数据后,就需要通知对应的 Broker 执行创建分区、创建目录等操作。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文总结了消息队列存储模块的设计和实现要点。首先介绍了存储模块的主要流程,包括数据的写入、存储、读取和过期,以及元数据和消息数据的存储。然后详细讨论了数据存储结构设计、数据分段存储、数据存储格式和数据清理机制等方面的内容。文章还提到了消息队列的存储分为元数据存储和消息数据存储两方面,以及元数据存储依赖第三方组件实现,而消息数据存储在功能层面包含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归属地:江苏
    2
    3
  • 张申傲
    每个分区独立一个文件存储,在分区数量较多时会退化成全局磁盘随机I/O,这也是Kafka在多Partition时吞吐量大幅下降的原因~

    作者回复: 是的,技术上确实是这个原理,但是大部分情况下其实还好。 因为只有在很极端的情况,比如分区很多,并且都存在读写的场景才会触发。 在现网,做好运营的话,控制好单机的分区数,触发的概率不大。 - -

    2023-06-30归属地:北京
    2
    2
  • 文敦复
    文中提到:(对所有分区公用1个单文件的情况下)缺点是同一个分区的数据一般会在文件中的不同目录。 这个“目录”是不是指文件不同位置的意思?

    作者回复: 是的,这里的表达有点问题。我想表达的意思是”缺点是同一个分区的数据一般会在文件中的不同位置,或者不同的文件段中“。我修改一下,谢谢提醒~ 感谢感谢

    2023-07-03归属地:四川
  • 阳阳
    如果能添加实战的内容就更好了。

    作者回复: 有这个规划的。我们先把理论讲完,理论扎实了,再一起来实战,效率会更高,效果也更好

    2023-07-02归属地:中国香港
  • aoe
    MQ 的 Topic、Partition 和 MySQL 的服务层、存储引擎层有点像

    作者回复: 区别还是蛮大的,你可以先想想区别是什么。提示一下,可以从功能层面分析底层存储结构的区别

    2023-06-30归属地:浙江
    2
  • 翡翠虎
    存储部分,嗅到了一点 bitcask 的味道,感觉很接近

    作者回复: 从工程的角度来看,消息队列是一个分布式存储系统。而分布式存储系统,底层的技术选型和设计要点其实是差不多的,有很多共性。只是形态和需求不一样,导致实现有差别。

    2023-06-30归属地:广西
  • 张申傲
    强哥讲的真好~
    2023-06-30归属地:北京
    2
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部