普遍消息存储技术的选型

  • 分布式KV存储
  • NewSQL存储:TiDB
  • 文件系统:RocketMQ,kafka,RabbitMQ

    • RocketMQ:所有的message存储在一个log里,不区分topic-queue
    • kafka:一个log文件存储单个topic-queue

RocketMQ实现消息存储

MappedFile(映射文件)

CommitLog

下图为CommitLog结构:MappedFile(真实的映射文件)组成MappedQueue构成

存储消息CommitLog.putMessage()

  • 获取最近一个CommitLog的内存映射文件(零拷贝)

    • MappedFileQueue.getLastMappedFile():从其维护的列表中获取最后一个,因为之前的都已经写满了
    • MappedFileQueue.load():构建一个MappedFile,加入到列表中
  • 如果最近的CommitLog文件写满了或者broker刚启动,mappedfile是空的,创建一个新的
    • MappedFileQueue.getLastMappedFile(create:true)
    • 计算要创建的CommitLog的起始偏移量(即映射文件的名)
    • allocateMappedFileService.putRequestAndReturnMappedFile()创建两个映射文件,但其实只要创建好第一个就返回了;
      • 两种创建MappedFile方式(内存映射):堆外内存池,直接创建TODO
      • 创建好后,对当前映射文件进行预热MappedFile.warmMappedFile:
      1. 对当前映射文件的每个内存页写入一个字节ByteBuffer,当刷盘策略为同步刷盘时,执行强制刷盘,每修改pages个分页刷一次盘;
      2. 因为对每个Mappedfile写入假字节的时候是通过循环的形式,而写入次数为MappedFile.size(1024M) / pagesize(4k),这样占有CPU的时间太久,所以线程会主动休眠,进入就绪状态,释放CPU
      3. MappedFile.mlock()将当前映射文件全部的地址空间锁定在物理存储中,防止被交换到swap空间
  • 把broker内部的这个message刷新到Mappedfile的内存中mappedFile.appendMessage(msg, this.appendMessageCallback),有以下两种方式

    • 直接将数据写到映射文件字节缓冲区mappedByteBuffer,后mappedByteBuffer.flush()
    • 先写到内存字节缓冲区writeBuffer,再从writeBuffer提交commit到文件通道FileChannel,后FileChannel.flush()
  • 刷盘:handleDiskFlush()
    • 同步刷盘GroupCommitService:将刷盘请求放入执行线程维护的请求队列中,超时时间内等待执行
    • 异步刷盘CommitRealTimeService/FlushCommitLogService:TODO
  • 主从同步:handleHA()
    • sync_master:HAService将刷盘请求放入GroupTransferService维护的写请求列表中

  

下图为CommitLog存储消息的流程:

ConsumerQueue/Index

是消息存储的索引文件:内存存储以topic(目录)/队列id(目录)/MappedFile.....

从CommitLog中拿到message

CommitLog写入message的时候,异步构建consumerqueue存储消息索引提供消费者消费

问题:

当topic数量增多时,kafka的单个broker的TPS降低了1个数量级,而RocketMQ在海量topic的场景下,依然保持较高的TPS?

CommitLog的”随机读”对性能的影响

RocketMQ存储系统概要设计和源码解读的更多相关文章

  1. 《Netty5.0架构剖析和源码解读》【PDF】下载

    <Netty5.0架构剖析和源码解读>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062545 内容简介 Netty 是个异步的 ...

  2. 图像分割之(四)OpenCV的GrabCut函数使用和源码解读

    图像分割之(四)OpenCV的GrabCut函数使用和源码解读         分类:            图像处理            计算机视觉             2013-01-23 ...

  3. Mybatis(四):MyBatis核心组件介绍原理解析和源码解读

    Mybatis核心成员 Configuration        MyBatis所有的配置信息都保存在Configuration对象之中,配置文件中的大部分配置都会存储到该类中 SqlSession ...

  4. Selenium系列(十) - 针对Select下拉框的操作和源码解读

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  5. Selenium系列(21) - Cookie操作和源码解读

    如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...

  6. tomcat架构分析和源码解读

    最近在看<深入分析java web技术内幕>,书中讲解了一部分tomcat的相关知识,我也去查看了一些源码,看了大神们写的代码,我才知道自己就像在做加减乘除一样,这是不行的.还有好多包和类 ...

  7. python 微信跳一跳和源码解读

    刚好周末,想研究一下前阵子很火的微信跳一跳 下面进入正文. 本文适用对象为WIN10系统,安卓用户.目的在于让丝毫没有接触过Python的小伙伴都能成功运行,如果你恰好是这样的对象,那么跟着我开始操作 ...

  8. [图像分割] OpenCV 的 GrabCut 函数使用和源码解读

    转自 zouxy09 GrabCut 原理参考这里,以下为 GrabCut 源码: ——看别人写的好的代码也很享受,干净利落,有些处理的细节也学习一下. /*M//////////////////// ...

  9. http-proxy-middleware使用方法和实现原理(源码解读)

    本文主要讲http-proxy-middleware用法和实现原理. 一 简介 http-proxy-middleware用于后台将请求转发给其它服务器. 例如:我们当前主机A为http://loca ...

随机推荐

  1. 爬取快代理的免费IP并测试

    各大免费IP的网站的反爬手段往往是封掉在一定时间内访问过于频繁的IP,因此在爬取的时候需要设定一定的时间间隔,不过说实话,免费代理很多时候基本都不能用,可能一千个下来只有十几个可以用,而且几分钟之后估 ...

  2. java实现spark常用算子之intersection

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaRDD;import org.apache.spark.a ...

  3. 05 Django之模型层---单表操作

    一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人 ...

  4. Eclipse中插件的运用

    1. hotcode2.jar 支持java代码热部署,改了本地java代码不需要重新部署生效,可以节省开发时间,提高开发效率. 安装方法: 到help -- install new software ...

  5. 自己实现一个简化版Mybatis框架

    MyBatis框架的核心功能其实不难,无非就是动态代理和jdbc的操作,难的是写出来可扩展,高内聚,低耦合的规范的代码.本文完成的Mybatis功能比较简单,代码还有许多需要改进的地方,大家可以结合M ...

  6. deep_learning_LSTM长短期记忆神经网络处理Mnist数据集

    1.RNN(Recurrent Neural Network)循环神经网络模型 详见RNN循环神经网络:https://www.cnblogs.com/pinard/p/6509630.html 2. ...

  7. 标准模板库(STL)

    组件: 容器:管理某类对象的集合. 迭代器:用来在一个对象集合内遍历元素. 算法:处理集合内的元素. 容器 序列式容器:顾名思义.array,vector,deque,list 和 forward_l ...

  8. PAT Basic 1019 数字黑洞 (20 分)

    给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞 ...

  9. [牛客] [# 1108 E] Grid

    2019牛客国庆集训派对day3 链接:https://ac.nowcoder.com/acm/contest/1108/E来源:牛客网 题意 在一个$10 ^ 9 * 10 ^ 9$ 的方格中,每次 ...

  10. 分布式中 CAP BASE ACID 理解(转载)

    概念理解(CAP,BASE, ACID) CAP CAP:  Consistency, Availability, Partition-tolerance 强一致性(Consistency).系统在执 ...