RocketMQ-存储与弹性伸缩

存储与弹性伸缩

  • 一、介绍
  • 二、存储架构图
    • 1.CommitLog
    • 2.ConsumeQueue
    • 3.IndexFile
  • 三、消息读写流程
    • 1.写入流程
      • 1.1 获取Topic元数据
      • 1.2 消息投递
      • 1.3 消息写入
    • 2.读取流程
      • 2.1 获取Topic元数据
      • 2.2 消息拉取
      • 2.3 消息消费
  • 四、消息持久化
    • 1.页缓存
    • 2.刷盘
      • 2.1 同步刷盘
      • 2.2 异步刷盘
  • 五、集群模式
    • 1.单Master模式
    • 2.多Master模式
    • 3.多Master多Slave模式-异步复制
    • 4.多Master多Slave模式-同步双写
  • 六、弹性伸缩
    • 1.NameServer
    • 2.Broker
      • 2.1 ConsumerQueue伸缩
      • 2.2 Broker伸缩
    • 3.Producer
    • 4.Consumer
  • 总结
  • 参考链接


一、介绍

主要是对RocketMQ的存储与弹性伸缩做一个学习和总结、加深印象。内容参考RocketMQ官方文档。

二、存储架构图

RocketMQ采用的是混合型存储结构,单个Broker实例将负责的所有队列用同一个日志数据文件(CommiLog)存储。
在这里插入图片描述

1.CommitLog

保存消息主体以及元数据,存储Producer端写入的消息主体内容。Broker负责的多个Topic的消息实体内容都存储于一个commitLog中。消息顺序写入commitLog文件,当文件满了,写入到下一个文件。

2.ConsumeQueue

消息消费队列类似kafka中的Topic下的分区,主要是为了提高消息消费的性能。针对主题消费不需要遍历commitLog文件并检索出对应topic消息。ConsumeQueue并不会保存消息主体内容,保存的主要是消息在CommitLog中的物理偏移量offset、消息的大小size、消息Tag的HashCode值。

3.IndexFile

提供一种可以通过key或者时间区间来查询消息的方法。

三、消息读写流程

1.写入流程

在这里插入图片描述

1.1 获取Topic元数据

  • 1.Producer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Producer获取topic元数据信息

1.2 消息投递

  • 3.Producer根据元数据信息选择Broker和需要投递的队列
  • 4.Producer发起远程请求投递消息到Broker

1.3 消息写入

  • 5.Broker将消息写入到CommitLog文件
  • 6.ReputMessageService异步读取CommitLog信息
  • 7.ReputMessageService根据消息的topic和队列信息,将消息的offset、size、消息Tag的HashCode值写入到对应队列

2.读取流程

在这里插入图片描述

2.1 获取Topic元数据

  • 1.Consumer与NameServer建立连接,发起获取Topic元数据请求
  • 2.Consumer获取topic元数据信息

2.2 消息拉取

  • 3.Consumer根据元数据信息选择Broker和需要消费的队列
  • 4.Consumer发起远程消费请求到Broker

2.3 消息消费

  • 5.Broker根据上次Offset从消费队列查找消息检索信息
  • 6.Broker从CommitLog查询到消息主体,然后返回消息主体信息给Consumer

四、消息持久化

对于单个Broker的消息持久化,主要是需要知道OS对文件的缓存和刷盘机制。如果只选择单个机器模式,一旦Broker重启或宕机会导致服务不可用,Broker磁盘损坏也会导致消息丢失,所以需要选择适合的机器模式来解决单点故障。

1.页缓存

操作系统为了加速对文件的读写,采用了页缓存机制(PageCache)。对于数据的写入,OS会先将内容写入到Cache内,随后才会将Cache内的数据刷盘至物理磁盘上。对于数据的读取,如果一次读取文件时未命中PageCache,OS会从物理磁盘上读取文件并加载到PageCache。
RocketMQ采用混合存储,ConsumerQueue逻辑消费队列存储内容比较少,而CommitLog存储所有Topic信息主体,也就是文件数量不会随着Topic线性增长,可以充分利用页缓存机制来加快消息的消费和写入。

2.刷盘

消息发送到Broker后,是先写入到OS内存,然后将内存中数据刷盘到物理磁盘,才能保证消息不丢失。

2.1 同步刷盘

同步刷盘是指只有Broker将消息持久化到磁盘后,Broker端才会返回给Producer端一个ACK响应。同步刷盘对MQ消息可靠性来说是一种不错的保障。

2.2 异步刷盘

异步刷盘是指只要Broker将消息写入到PageCache,Broker端就会返回Producer端一个ACK响应。消息刷盘采用后台异步线程提交的方式进行,降低了读写延迟,提高了MQ的性能和吞吐量。

五、集群模式

1.单Master模式

单个Master一旦Broker重启或者宕机时,会导致服务不可用,不建议生产环境使用。

2.多Master模式

一个集群全是Master,配置简单,单个Maste宕机或重启对应用无影响。但是宕机机器在恢复之前,消息无法消费。

3.多Master多Slave模式-异步复制

每个Master配置一个Slave,有多对Master-Slave,采用异步复制方式,主备有短暂消息延迟(毫秒级)

  • 优点:即使磁盘损坏,消息丢失的非常少,且消息实时性不会受影响,同时Master宕机后,消费者仍然可以从Slave消费,而且此过程对应用透明,不需要人工干预,性能同多Master模式几乎一样;
  • 缺点:Master宕机,磁盘损坏情况下会丢失少量消息。

4.多Master多Slave模式-同步双写

每个Master配置一个Slave,有多对Master-Slave,采用同步双写方式,即只有主备都写成功,才向应用返回成功。

  • 优点:数据与服务都无单点故障,Master宕机情况下,消息无延迟,服务可用性与数据可用性都非常高;
  • 缺点:性能比异步复制模式略低,发送单个消息的RT会略高

六、弹性伸缩

1.NameServer

通过HTTP服务来设置NameServer地址,可以支持动态增加NameServer。

2.Broker

2.1 ConsumerQueue伸缩

如果消息积压并且Consumer实例数量已经提升到与消息队列一致的情况下,可以通过同步增加ConsumerQueue与Consumer实例数量来减少消息的积压。增加ConsumerQueue后会触发所有Consumer实例的负载均衡。

2.2 Broker伸缩

如果Broker有性能瓶颈,可以通过新增Broker。在新的Broker进行新Topic创建或者已有Topic消费队列的创建来分担原有Broker的压力。

3.Producer

Producer发送消息的时候,默认会轮询消费队列进行消息发送。新增的Producer会从NameServer获取Topic的元数据从而选择对应的消费队列进行消息发送,删除的Producer不会有任何影响。

4.Consumer

在集群消费模式下,如果消费能力不足,可以通过增加消费组下的Consumer实例来增加消费能力。但是此模式下,每个消费队列只能由消费组下的一个Consumer实例来进行消费,也就是如果消费实例数量大于消费队列数量的消费实例不会进行消费,属于浪费资源。
消费组下的Consumer实例增加或者减少都会触发所有实例的负载均衡,将消费队列分配到对应的Consumer实例。

总结

RocketMQ采用的是混合存储,将Broker上的所有Topic信息主体保存到同一个文件中。特别适合内部消息队列的场景,即Topic数量多、但是每个Topic的消息量较少的场景。采用多种集群部署模式,可以适用多种可靠性场景。具有很强的弹性伸缩能力来满足业务波动的场景。


参考链接

1.RocketMQ存储架构
2.GitHub RocketMQ中文文档
3.Apache RocketMQ开发者指南
4.Apache RocketMQ 集群部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/443769.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣hot100:76.最小覆盖子串(滑动窗口)

本题使用滑动窗口解决,用right表示滑动窗口的右边界,left表示滑动窗口的左边界。寻找可行解,我们可以这样约定滑动窗口的意义:right指针向右移动,是使得滑动窗口找到可行解。left指针向右移动是为了更新窗口使得其可以…

定位算法——TDOA的Chan算法推导与Matlab实现

TDOA算法原理 TDOA(Time Difference of Arrival)——时间差到达算法,利用了几何数学中双曲线的特点—— 双曲线上的任意点到达两焦点的距离差是固定值。 这个距离差它天然可以抹去用户设备(UE)和基站的之间时钟误差。 P 1 C 1 c ⋅ ( t 11 Δ t ) P_1C_1 c(t_…

武汉灰京文化:5G与云计算技术下的手游行业,技术创新将带来怎样的变革?

随着技术的不断进步,手游行业将迎来一场革命性的变革。5G网络的普及和云计算技术的飞速发展,将为手游带来更加流畅、高清晰度的游戏体验,让玩家们尽情享受更真实、更沉浸式的虚拟现实和增强现实游戏。同时,人工智能技术的运用也将…

【Linux】cpp-httplib库

目录 升级gcc版本 下载cpp-httplib的zip安装包,上传到服务器 ​编辑 简单使用 首先打开gittee,搜索cpp-httplib,选择其中一个即可 也可以点下方链接 cpp-httplib库:cpp-httplib: cpp-httplib (gitee.com) 注意:cpp-httplib在使用的时候需…

BUU [网鼎杯 2020 半决赛]AliceWebsite

BUU [网鼎杯 2020 半决赛]AliceWebsite 开题&#xff1a; hint附件是源码。在index.php中有一个毫无过滤的本地文件包含 <?php $action (isset($_GET[action]) ? $_GET[action] : home.php); if (file_exists($action)) {include $action; } else {echo "File not…

人工智能|机器学习——DBSCAN聚类算法(密度聚类)

1.算法简介 DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法&#xff0c;簇集的划定完全由样本的聚集程度决定。聚集程度不足以构成簇落的那些样本视为噪声点&#xff0c;因此DBSCAN聚类的方式也可以用于异常点的检测。 2.算法原…

使用python获取电脑的公网 IP

python 代码&#xff1a; from requests import getip get(https://api.myip.la).text print(My public IP address is: {}.format(ip))输出结果&#xff1a;

XSS-Labs靶场1---11关

一、XSS环境搭建&#xff1a; [ 靶场环境篇 ] XSS-labs 靶场环境搭建(特别详细)_xss靶场搭建-CSDN博客 &#xff08;该博主总结的较为详细&#xff0c;若侵权必删&#xff09; 常用的xss攻击语句&#xff1a; 输入检测确定标签没有过滤后&#xff0c;为了显示存在漏洞&#…

python并发编程-多路复用IO

多路复用IO(IO multiplexing) O multiplexing这个词可能有点陌生&#xff0c;但是如果我说select/epoll&#xff0c;大概就都能明白了。有些地方也称这种IO方式为事件驱动IO (event driven IO)。我们都知道&#xff0c;select/epoll的好处就在于单个process就可以同时处理多个…

【蓝桥杯-单片机】基础模块LED和按键

文章目录 【蓝桥杯-单片机】Led、按键等基础模块01 前置准备&#xff08;1&#xff09;新建工程&#xff08;4&#xff09;编写程序 02 基础模块&#xff1a;LED&#xff08;0&#xff09;LED原理图&#xff08;1&#xff09;对P1整体赋值&#xff0c;控制所有的LED灯&#xff…

【C++】函数模板和类模板

目录 1.泛型编程 2.函数模板 2.1函数模板的定义格式 2.2函数模板的实例化 2.3函数模板参数的匹配原则 3.类模板 3.1类模板的定义格式 3.2类模板的实例化 3.3模板的分离编译 1.泛型编程 泛型编程&#xff1a;编写与类型无关的通用代码&#xff0c;是代码复用的一种手段…

Linux——文件重定向

目录 前言 一、重定向 二、重定向的运用 三、dup2 四、命令行中的重定向 五、为什么要有标准错误 前言 在之前我们学习了文件标识符&#xff0c;直到close可以使用文件标识符进行关闭&#xff0c;但是当我们关闭1号&#xff08;stdout&#xff09;时&#xff0c;无法往显…

java 哨兵线性搜索

顾名思义&#xff0c;哨兵线性搜索是线性搜索的一种&#xff0c;与传统线性搜索相比&#xff0c;比较次数减少了。在传统的线性搜索中&#xff0c;仅进行N次比较&#xff0c;而在哨兵线性搜索中&#xff0c;哨兵值用于避免任何越界比较&#xff0c;但没有专门针对正在搜索的元素…

springMVC自定义类型转换

目录 &#x1f34b;&#x1f34a;自定义的转换类 &#x1f34b;&#x1f34a;xml文件中添加配置 &#x1f34b;&#x1f34a;测试 SpringMVC 底层已经封装了很多的类型转换器&#xff0c;也就是为什么我们页面上传的字符串可以使用 Integer接收或者可以直接转换为数组的原因…

学习 考证 帆软 FCP-FineBI V6.0 考试经验

学习背景&#xff1a; 自2024年1月起&#xff0c;大部分时间就在家里度过了&#xff0c;想着还是需要充实一下自己&#xff0c;我是一个充满热情的个体。由于之前公司也和帆软结缘&#xff0c;无论是 Fine-Report 和 Fine-BI 都有接触3年之久&#xff0c;但是主要做为管理者并…

高级语言讲义2010计专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

JavaWeb--Mybatis

一&#xff1a;Mybatis概述 1.Mybatis概念 MyBatis 是一款优秀的 持久层框架 &#xff0c;用于简化 JDBC 开发&#xff1b; MyBatis 本是 Apache 的一个开源项目 iBatis, 2010 年这个项目由 apache software foundation 迁移到了 google code&#xff0c;并且改名为 MyB…

《Effective Modern C++》- 极精简版 15-21条

本文章属于专栏《业界Cpp进阶建议整理》 继续上篇《Effective Modern C》- 极精简版 5-14条。本文列出《Effective Modern C》的15-21条的个人理解的极精简版本。 Item15、尽量使用constexpr constexpr形容对象 constexpr对象都是const&#xff0c;但是const对象不一定是conste…

全网最最最详细centos7如何安装docker教程

在CentOS 7上安装Docker主要包括以下步骤&#xff1a; 1. 卸载旧版本的Docker 首先&#xff0c;需要确保系统上没有安装旧版本的Docker。可以通过以下命令来卸载它们&#xff1a; sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-late…

C++篇 语 句

到目前为止&#xff0c;我们只见过两种语句&#xff1a; return 语句和表达式语句。根据语句对执行顺 序的影响&#xff0c;C 语言其余语句大多属于以下 3 大类。 选择语句&#xff1a; if 语句和 switch 语句。循环语句&#xff1a; while 语句&#xff0c; do...while 语句和…