RocketMQ: 部署结构与存储特点

RocketMQ 是什么

  • 它是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点
    • Producer、Consumer、队列都可以分布式
    • Producer 向一些队列轮流发送消息
      • 队列集合称为 Topic
      • Consumer 如果做广播消费
      • 则一个 consumer 实例消费这个 Topic 对应的所有队列
      • 如果做集群消费,则多个 Consumer 实例平均消费这个 topic 对应的队列集合
    • 能够保证严格的消息顺序
    • 提供丰富的消息拉叏模式
    • 高效的订阅者水平扩展能力
    • 实时的消息订阅机制
    • 亿级消息堆积能力
    • 较少的依赖

部署结构


1 ) 物理部署结构

上图是 RocketMQ 网络部署特点

  • Name Server 是一个几乎无状态节点,可集群部署,节点之间无任何信息同步
  • Broker 部署相对复杂
    • Broker 分为 Master 与 Slave,一个 Master 可以对应多个 Slave
    • 但是一个 Slave 只能对应一个 Master
    • Master 与 Slave 的对应关系通过指定相同的 BrokerName
    • 不同的 BrokerId 来定义 BrokerId 为 0 表示 Master,非 0 表示 Slave
    • Master 也可以部署多个,每个 Broker 与 Name Server 集群中的所有节点建立长连接
    • 定时注册 Topic 信息到所有 Name Server
  • Producer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接
    • 定期从 Name Server 取 Topic 路由信息
    • 并向提供 Topic 服务的 Master 建立长连接
    • 且定时向 Master 发送心跳,Producer 完全无状态,可集群部署
  • Consumer 与 Name Server 集群中的其中一个节点(随机选择)建立长连接
    • 定期从 Name Server 取 Topic 路由信息
    • 并向提供 Topic 服务的 Master、Slave 建立长连接
    • 且定时向 Master、Slave 发送心跳
    • Consumer 既可以从 Master 订阅消息
    • 也可以从 Slave 订阅消息,订阅规则由 Broker 配置决定

2 ) 逻辑部署结构

  • Producer Group
    • 用来表示一个发送消息应用,一个 Producer Group 下包含多个 Producer 实例
    • 可以是多台机器,也可以是一台机器的多个进程,或者一个进程的多个 Producer 对象
    • 一个 Producer Group 可以发送多个 Topic消息,Producer Group 作用如下:
      • 1.标识一类 Producer
      • 2.可以通过运维工具查询这个发送消息应用下有多个 Producer 实例
      • 3.发送分布式事务消息时,如果 Producer 中途意外宕机
        • Broker 会主动回调 Producer Group 内的任意
        • 一台机器来确认事务状态
  • Consumer Group
    • 用来表示一个消费消息应用,一个 Consumer Group 下包含多个 Consumer 实例
    • 可以是多台机器,也可以是多个进程,或者是一个进程的多个 Consumer 对象
    • 一个 Consumer Group 下的多个 Consumer 以均摊方式消费消息
    • 如果设置为广播方式,这个 Consumer Group 下的每个实例都消费全量数据

RocketMQ 存储特点


1 )零拷贝原理

Consumer 消费消息过程,使用了零拷贝,零拷贝包含以下两种方式

1. 使用 mmap + write 方式

  • 优点:即使频繁调用,使用小块文件传输,效率也很高
  • 缺点:不能很好的利用 DMA 方式,会比 sendfile 多消耗 CPU,内存安全性控制复杂,需要避免 JVM Crash 问题

2. 使用 sendfile 方式

  • 优点:可以利用 DMA 方式,消耗 CPU 较少,大块文件传输效率高,无内存安全新问题
  • 缺点:小块文件效率低于 mmap 方式,只能是 BIO 方式传输,不能使用 NIO

RocketMQ 选择了第一种方式,mmap+write 方式,因为有小块数据传输的需求,效果会比 sendfile 更好

关于 Zero Copy 的更详细介绍,参考:https://www.linuxjournal.com/article/6345

2 )文件系统

  • RocketMQ 选择 Linux Ext4 文件系统,原因如下:Ext4 文件系统删除 1G 大小的文件通常耗时小于 50ms,而 Ext3 文件系统耗时约 1s 左史,且删除文件时,磁盘IO 压力极大,会导致 IO 写入超时
  • 文件系统局面需要做以下调优措施
  • 文件系统 IO 调度算法需要调整为 deadline,因为 deadline 算法在随机读情况下,可以合并读请求为顺序跳跃方式,从而提高读 IO 吞吐量
  • Ext4 文件系统有以下 Bug,请注意

3 )数据存储结构

4 ) 存储目录结构

|-- abort
|-- checkpoint
|-- config
| |-- consumerOffset.json
| |-- consumerOffset.json.bak
| |-- delayOffset.json
| |-- delayOffset.json.bak
| |-- subscriptionGroup.json
| |-- subscriptionGroup.json.bak
| |-- topics.json
| `-- topics.json.bak
|-- commitlog
| |-- 00000003384434229248
| |-- 00000003385507971072
| `-- 00000003386581712896
`-- consumequeue
 |-- %DLQ%ConsumerGroupA
 | `-- 0
 | `-- 00000000000006000000
 |-- %RETRY%ConsumerGroupA
 | `-- 0
 | `-- 00000000000000000000
 |-- %RETRY%ConsumerGroupB
 | `-- 0
 | `-- 00000000000000000000
 |-- SCHEDULE_TOPIC_XXXX
 | |-- 2
 | | `-- 00000000000006000000
 | |-- 3
 | | `-- 00000000000006000000
 |-- TopicA
 | |-- 0
 | | |-- 00000000002604000000
 | | |-- 00000000002610000000
 | | `-- 00000000002616000000
 | |-- 1
 | | |-- 00000000002610000000
 | | `-- 00000000002616000000
 |-- TopicB
 | |-- 0
 | | `-- 00000000000732000000
 | |-- 1
 | | `-- 00000000000732000000
 | |-- 2
 | | `-- 00000000000732000000

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

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

相关文章

帮助中心FAQ系统:打造卓越客户服务体验的关键驱动力

在当今这个信息爆炸的时代,企业为了保持市场竞争力,必须不断提升客户服务体验。FAQ(常见问题解答)系统,作为一种高效且便捷的用户服务工具,正日益受到企业的青睐。本文将阐述FAQ系统的核心价值、功能特性以…

如何使用 Python 开发一个简单的文本数据转换为 Excel 工具

目录 一、准备工作 二、理解文本数据格式 三、开发文本数据转换为Excel工具 读取CSV文件 将DataFrame写入Excel文件 处理其他格式的文本数据 读取纯文本文件: 读取TSV文件: 四、完整代码与工具封装 五、使用工具 六、总结 在数据分析和处理的…

Elasticsearch向量搜索:从语义搜索到图搜图只有一步之遥

续 上集说到语义搜索,这集接着玩一下图搜图,这种场景在电商中很常见——拍照搜商品。图搜图实现非常类似语义搜索,代码逻辑结构都很类似… 开搞 还是老地方modelscope找个Vision Transformer模型,这里选用vit-base-patch16-224…

Flink【基于时间的双流联结 Demo】

前言 1、基于时间的双流联结(Join) 对于两条流的合并,很多情况我们并不是简单地将所有数据放在一起,而是希望根据某个字段的值将它们联结起来,“配对”去做处理。例如用传感器监控火情时,我们需要将大量温度…

大数据入门-什么是Flink

这里简单介绍Flink的概念、架构、特性等。至于比较详细的介绍,会单独针对这个组件进行详细介绍,可以关注博客后续阅读。 一、概念 Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。 Flink的四大基…

KubeVirt下gpu operator实践(GPU直通)

KubeVirt下gpu operator实践(GPU直通) 参考《在 KubeVirt 中使用 GPU Operator》,记录gpu operator在KubeVirt下实践的过程,包括虚拟机配置GPU直通,容器挂载GPU设备等。 KubeVirt 提供了一种将主机设备分配给虚拟机的机制。该机制具有通用性…

How to update the content of one column in Mysql

How to update the content of one column in Mysql by another column name? UPDATE egg.eggs_record SET sold 2024-11-21 WHERE id 3 OR id 4;UPDATE egg.eggs_record SET egg_name duck egg WHERE id 2;

【K8S系列】imagePullSecrets配置正确,但docker pull仍然失败,进一步排查详细步骤

如果 imagePullSecrets 配置正确,但在执行 docker pull 命令时仍然失败,可能存在以下几种原因。以下是详细的排查步骤和解决方案。 1. 检查 Docker 登录凭证 确保你使用的是与 imagePullSecrets 中相同的凭证进行 Docker 登录: 1.1 直接登录 在命令行中,执行以下命令: …

机器学习基础06

目录 1.梯度下降 1.1梯度下降概念 1.2梯度下降公式 1.3学习率 1.4实现梯度下降 1.5API 1.5.1随机梯度下降SGD 1.5.2小批量梯度下降MBGD 1.6梯度下降优化 2.欠拟合过拟合 2.1欠拟合 2.2过拟合 2.3正则化 2.3.1L1正则项(曼哈顿距离) 2.3.2…

徒手从零搭建一套ELK日志平台

徒手从零搭建一套ELK日志平台 日志分析的概述日志分析的作用主要收集工具集中式日志系统主要特点采集日志分类ELK概述初级版ELK终极版ELK高级版ELKELK收集日志的两种形式 搭建ELK平台Logstash工作原理Logstash核心概念环境准备安装部署docker添加镜像加速器安装部署Elasticsear…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的,用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载: https://www.klayout.de/build.html KLayout图形用户界面&…

Linux离线安装Docker命令,简单镜像操作

解压安装包 首先,使用 tar 命令解压 docker-27.3.1.tgz 安装包: tar -zxvf docker-27.3.1.tgz 将二进制文件移动到可执行路径上的目录 接着,将解压出来的 Docker 二进制文件复制到系统的可执行路径(通常是 /usr/bin/&#xff09…

Redis中常见的数据类型及其应用场景

五种常见数据类型 Redis中的数据类型指的是 value存储的数据类型,key都是以String类型存储的,value根据场景需要,可以以String、List等类型进行存储。 各数据类型介绍: Redis数据类型对应的底层数据结构 String 类型的应用场景 常…

redis中的set类型及常用命令

集合就是把一些有关联的数据放到一起。与list不同的是,集合中的顺序不重要,变换了元素的顺序,仍是同一个集合。集合中的元素是不能重复的。和list类似,集合中的每个元素,也都是string类型。 关于集合的相关命令 sadd/…

Python的顺序表

一、脑图 二、封装一个顺序表的类 1.构造函数 class SeqList:#显性定义出构造函数def __init__(self,capacity 10):#初始化顺序表 ,设置初始容量和已有元素self.capacity capacity #线性表的最大容量self.size 0 #已存储的元素个数self.data [None]*capacity…

OpenCV从入门到精通实战(九)——基于dlib的疲劳监测 ear计算

本文实现Python库d和OpenCV来实现眼部闭合检测,主要用于评估用户是否眨眼。 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,如dlib、OpenCV和scipy。通过argparse设置了输入视频和面部标记预测器的参数。 from…

windows下,用CMake编译qt项目,出现错误By not providing “FindQt5.cmake“...

开发环境:windows10 qt5.14, 编译器msvc2017x64,CMake3.30; 现象: CMakeList文件里,如有find_package(Qt5 COMPONENTS Widgets REQUIRED) target_link_libraries(dis_lib PRIVATE Qt5::Widgets) 用CMak…

基于SpringBoot+Vue的影院管理系统(含演示视频+运行截图+说明文档)

web启动链接地址: http://localhost:8082(管理端) http://localhost:8081(用户端) http://localhost:8082(员工端) 一、项目介绍 基于框架的系统,系统分为用户、员工和管理员三个…

SpringBoot3+Vue3开发图书馆管理系统

1 项目介绍 图书馆管理系统,管理图书、用户、借书、还书、实时监测归还是否逾期,逾期未归还会生成违规记录。违规状态不可借阅图书。需缴纳罚金,消除违规记录。可动态设置图书最多累计借阅数量上限和最长借阅天数上限,当用户满足…

Figure 02迎重大升级!!人形机器人独角兽[Figure AI]商业化加速

11月19日知名人形机器人独角兽公司【Figure AI】发布公司汽车巨头【宝马】最新合作进展,旗下人形机器人Figure 02在生产线上的性能得到了显著提升,机器人组成自主舰队,依托端到端技术,速度提高了400%,执行任务成功率提…