Chapter5-消息队列的核心机制

news2024/9/25 10:37:58

        Broker 是 RocketMQ 的核心,大部分‘重量级”工作都是由 Broker 完成的,包括接收 Producer 发过来的消息、处理 Consumer 的消费消息请求、-消息的持久化存储、消息的 HA 机制以及服务端过滤功能等。

5.1 消息存储和发送 

        分布式队列因为有高可靠性的要求,所以数据要通过磁盘进行持久化存储。使用得当,磁盘的速度完全可以匹配上网络的数据传输速度 。目前的高性能磁盘,顺序写速度可以达到 600MB/s ,超过了一般网卡的传输速度,这是磁盘比想象的快的地方。 但是磁盘随机写的速度只有大概 lOOKB/s,和顺序写的性能相差 6000 倍!因为有如此巨大的速度差别,好的消息队列系统会比普通的消息队列系统速度快多个数量级。

        举个例子, Linux 操作系统分为“用户态”和“内核态”,文件操作、网络操作需要涉及这两种形态的切换,免不了进行数据复制,一台服务器把本机磁盘文件的内容发送到客户端 一般分为两个步骤:

        1 ) read(file, tmp_buf, len);,读取本地文件内容;

        2) write(socket, tmp_buf, len);,将读取的内容通过网络发送出去 。

        tmp_buf 是预先申请的内存,这两个看似简单的操作,实际进行了 4 次数据复制,分别是:从磁盘复制数据到内核态内存,从内核态内存复制到用户态内存(完成了 read(file, tmp_b叫 len ));然后从用户态内存复制到网络驱动的内核态内存,最后是从网络驱动的内核态内存复制到网卡中进行传输(完成write(socket, tmp_buf, len )) 。

通过使用 mmap 的方式,可以省去向用户态的内存复制,提高速度 。 这种机制在 Java 中是通过 MappedByteBuffer 实现的,具体可以参考 Java 7 的文档: https ://docs.oracle.com/javase/7 /docs/api/java/nio/MappedByteBuffer.html 。RocketMQ 充分利用了上述特性,也就是所谓的“零拷贝”技术,提高消息存盘和网络发送的速度 。

5.2 消息存储结构

         RocketMQ 消息的存储是由 ConsumeQueue 和 CommitLog 配合完成的,消息真正的物理存储文件是 CommitLog, ConsumeQueue 是消息的逻辑队列,类似数据库的索引文件,存储的是指向物理存储的地址。 每个 Topic 下的每个 Message Queue 都有一个对应的 ConsumeQueue 文件。 文件地址在$ {$storeRoot} \consumequeue\$ {topicName} \$ {queueld} \$ {fileName }。

        CommitLog 以物理文件的方式存放,每台 Broker 上的 CommitLog 被本机器所有 Consume-Queue 共享,文件地址:$ {user.home} \store\$ {commitlog} \ ${fileName } 。 在 CommitLog 中,一个消息的存储长度是不固定的, RocketMQ采取一些机制,尽量向 CommitLog 中顺序写 ,但是随机读。 ConsumeQueue 的内 容也会被写到磁盘里作持久存储。

存储机制这样设计有以下几个好处:

        1 ) CommitLog 顺序写 ,可以大大提高写入效率。

        2 ) 虽然是随机读,但是利用操作系统的 pagecache 机制,可以批量地从磁盘读取,作为 cache存到内存中,加速后续的读取速度。

        3 )为了保证完全的顺序写,需要 ConsumeQueue 这个中间结构 ,因为ConsumeQu巳ue 里只存偏移量信息,所以尺寸是有限的,在实际情况中,大部分的 ConsumeQueue 能够被全部读人内存,所以这个中间结构的操作速度很快,可以认为是内存读取的速度 。 此外为了保证 CommitLog 和 ConsumeQueue 的一致性, CommitLog 里存储了 Consume Queues 、 Message key、 Tag 等所有信息,即使 ConsumeQueue 丢失,也可以通过 commitLog 完全恢复出来 。

         Broker 在文件系统中存储的各个文件。 我们可以看到 commitlog 文件夹 、 consumequeue 文件夹,还有在 con fig 文件夹中 Topic 、Consumer 的相关信息 。 最下面那个文件夹 index 存的是索引文件,这个文件用来加快消息查询的速度 。

5.3 高可用性机制 

        RocketMQ 分布式集群是通过 Master 和 Slave 的配合达到高可用性的,首先说一下 Master 和 Slave 的区别:在 Broker 的配 置 文件中,参数 brokerId  的值为 0 表明这个 Broker 是 Master大于 0 表 明这个 Broker 是 Slave同时 brokerRole 参数 也会说明这个 Broker 是 Master 还是 Slave 。 Master 角色的 Broker 支持读和写, Slave 角色的 Broker 仅支持读,也就是 Producer 只能和 Master 角色的 Broker 连接写入消息; Consumer 可以连接 Master 角色的Broker ,也可以连接 Slave 角色的 Broker 来读取消息 。

        在 Consumer 的配置文件中,并不需要设置是从 Master 读还是从 Slave读,当 Master 不可用或者繁忙的时候, Consumer 会被自动切换到从 Slave 读。有了自动切换 Consumer 这种机制,当一个 Master 角色的机器出现故障后,Consumer 仍然可以从 Slave 读取消息,不影响 Consumer 程序 。 这就达到了消费端的高可用性。 

        如何达到发送端的高可用性呢?在创建 Topic 的时候,把一个Topic 的多个Message Queue 创建在多个 Broker 组上(相同 Broker 名称,不同 brokerId 的机器组成一个 Broker 组),这样当 一个 Broker 组的 Master 不可用后,其他组Master 仍然可用, Producer 仍然可以发送消息 。 RocketMQ 目前还不支持把Slave 自动转成 Master ,如果机器资源不足,需要把 Slave 转成 Master ,则要手动停止 Slave 角色的 Broker ,更改配置文件,用新的配置文件启动 Broker 。 

5.4 同步刷盘和异步刷盘 

  • 异步刷盘方式:在返回写成功状态时 ,消息可能只是被写入了内存的PAGECACHE ,写操作的返回快,吞吐量大 ;当内存里的消息量积累到一定程度时 ,统一触发写磁盘动作,快速写人。
  •  同步刷盘方式:在返回写成功状态时,消息已经被写入磁盘。 具体流程是,消息、写入内存的 PAGECACHE 后,立刻通知刷盘线程刷盘,然后等待刷盘完成,刷盘线程执行完成后唤醒等待的线程,返回消息写成功的状态 。

        同步刷盘还是异步刷盘,是通过 Broker 配置文件里的 flushDiskType 参数设置的,这个参数被配置成 SYNC_FLUSH 、 ASYNC_FLUSH 中的一个 。

5.5 同步复制和异步复制 

        如果一个 Broker 组有 Master 和 Slave, 消息需要从 Master 复制到 Slave上,有同步和异步两种复制方式。 同步复制方式是等 Master 和 Slave 均写成功后才反馈给客户端写成功状态;异步复制方式是只要 Master 写成功即可反馈给客户端写成功状态。

        这两种复制方式各有优劣,在异步复制方式下,系统拥有较低的延迟和较高的吞吐量,但是如果 Master 出了故障,有些数据因为没有被写人 Slave ,有可能会丢失;在同步复制方式下,如果 Master 出故障, Slave 上有全部的备份数据,容易恢复,但是同步复制会增大数据写入延迟,降低系统吞吐量。

        同步复制和异步复制是通过 Broker 配置文件里的 brokerRole 参数进行设置的,这个参数可以被设置成 ASYNC_MASTER 、 SYNC_MASTER 、 SLAVE 三个值中的一个。

        实际应用中要结合业务场景,合理设置刷盘方式和主从复制方式,尤其是SYNC_FLUSH 方式,由于频繁地触发磁盘写动作, 会明显降低性能通常情况下,应该把 Master 和 Save 配置成 ASYNC_FLUSH 的刷盘方式,主从之间配置成 SYNC_MASTER 的复制方式,这样即使有一台机器出故障, 仍然能保证数据不丢,是个不错的选择。

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络协议-TCP、IP协议和互联网协议群

目录 TCP/IP协议群简介(互联网协议群)(Internet Protocol Suite) 应用层(Application)(合并简化了展示层,会话层) 传输层(Transport) 网络层(Internet&am…

射频功率放大器在铝板损伤量化表征中的应用

实验名称:基于异常指数的铝板损伤量化表征 研究方向:损伤量化 测试目的: 结构损伤检测与量化评估对于保障航空、航天、船舶、石油化工及兵器工业等领域的基础设施结构安全性具有重要意义,受到了广泛的关注。在现有的结构监测技术中…

微内核与宏内核

了解Linux发展史的同学都知道,关于linux吵架史的一段佳话,就是关于内核设计思想之争,这段故事在linus Tovalds的自传中也有提到。我们都知道linux操作系统由Linus Tovalds模仿minix操作系统开发的。 虽然Linux是受MINIX启发而发明&#xff0c…

Git——利用SSH密钥本地仓库上传远程GitHub库

文章目录 1、前言2、详细步骤2.1 创建密钥2.2 进入密钥文件并复制2.3 在GitHub上添加密钥2.4 回到本地仓库文件夹,连接GitHub并上传 3. 结语 1、前言 现在想要从本地设备将本地仓库上传到GitHub上需要用到SSH密钥,接下来讲解大致的步骤,本文默…

一本通 3.4.6 拓扑排序

1352:【例4-13】奖金 【题目描述】 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出,Yali Company总经理Mr.Z心情好,决定给每位员工发奖金。公司决定以每个人本年在公司的贡献为标准来计算他们得到奖金的多少。 于是Mr.Z下令召开m方会谈…

openEuler实验-基于openEuler的云景平台文件管理系统

一些常见的Linux命令 目录 前言 实验目的 实验内容 实验知识点 实验环境 实验分析 系统登录和电源管理 1)使用login命令登录系统 2)退出openEuler 3)退出当前的shell 软件管理 1)查询目录信息 2)切换目录路…

基于Tensorflow搭建卷积神经网络CNN(服装分类)保姆及级教程

项目介绍 TensorFlow2.X 搭建卷积神经网络(CNN),实现服装的分类识别。搭建的卷积神经网络是类似VGG的结构(卷积层与池化层反复堆叠,然后经过全连接层,最后用softmax映射为每个类别的概率,概率最大的即为识…

25 - 回文串问题

文章目录 1. 回文子串法一:动态规划法二:双指针法 2. 最长回文子串方法一:动态规划法方法二:双指针法 3. 最长回文子序列 1. 回文子串 法一:动态规划 递推公式 当s[i] ! s[j],那没啥好说的了,d…

三闯港交所,主打性价比的乡村基如何夺魁“中式快餐第一股”?

曾被中金公司称为“中国大消费最燃赛道”的中式餐饮,正在密集掀起IPO的风潮。去年5月和7月,老乡鸡和老娘舅分别向上交所提交招股书,绿茶餐厅、杨国福麻辣烫、捞王等企业也在推进上市计划。 国内第四大中式快餐集团,占据约0.6%市场…

python版pytorch模型转openvino及调用

一、openvino安装 参看官方文档https://www.intel.com/content/www/us/en/developer/tools/openvino-toolkit/download.html 安装命令是根据上面的选择生成。这里安装了pytorch和onnx依赖。 二、pytorch模型转opnvino模型推理 import os import time import cv2 import nu…

易基因:MeRIP-seq等揭示m6A甲基化修饰对抗病毒基因表达的转录调控机制|Cell Rep

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 2021年03月02日,杜克大学医学中心的分子遗传学和微生物学系Stacy M. Horner教授团队在《Cell Reports》(IF: 9.995)杂志发表了题为“Post-transcripti…

LeetCode算法小抄--归并排序详解及应用

LeetCode算法小抄--归并排序详解及应用 归并排序详解及应用[912. 排序数组](https://leetcode.cn/problems/sort-an-array/)[315. 计算右侧小于当前元素的个数](https://leetcode.cn/problems/count-of-smaller-numbers-after-self/)[hard]--华为笔试[493. 翻转对](https://lee…

Java版本工程项目管理系统源码-全面的工程项目管理

​ ​工程项目管理系统是指从事工程项目管理的企业(以下简称工程项目管理企业)受业主委托,按照合同约定,代表业主对工程项目的组织实施进行全过程或若干阶段的管理和服务。 如今建筑行业竞争激烈,内卷严重&#xff0c…

供应链优化的好处是什么?

企业可以从优质的供应链优化软件中获得许多好处: 成本降低 通过供应链优化,可以消除许多不必要的成本,从而简化业务运营费用。所有重复或无效的流程也可以根据需要消除或自动化。重点可以转移到通过准确及时交付来满足客户的需求上。通过供…

OpUtils网络端口扫描

网络端口扫描程序使 IT 管理员能够密切监视端口,这些端口是网络通信的端点。网络端口支持不同实体之间的数据传输,并支持运行各种服务或应用程序。在日常工作中,网络管理员的任务是扫描和监控数百个交换机端口。网络端口扫描程序工具通过帮助…

Intellij IDEA-插件开发环境搭建

插件开发有两种方式 1.基于Gradle(新版IDEA,按钮名称叫做IDE Plugin,具体多新我也不清楚,反正2023的必须是这种) 2.基于Dev kit(旧版IDEA,按钮名称叫做IntelliJ Platform Plugin,具体…

【GitLab私有仓库】在Linux上用Gitlab搭建自己的私有库并配置cpolar内网穿透

前言 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的Web服务。 Gitlab是被广泛使用的基于git的开源代码管理平台, 基于Ruby on Rails构建, 主要针对软件开发过程中产生的代码和文档进行管理, Gitlab主要针对…

基于Udacity模拟器的端到端自动驾驶决策

1 端到端自动驾驶决策 端到端自动驾驶决策的输入为车辆的感知信息,如摄像头信息,输出为车辆的前轮转角和摄像头等信息。 如上图所示,为英伟达公司的端到端自动驾驶决策框架,其CNN网络如下图所示,其中包括一个归一化…

狂神说Docker

思维导图: 文章目录 1.Docker概念与安装1.1 概述1.2 安装1.3 卸载1.4 Docker的执行镜像原理1.5 Docker为什么比Vm快1.6 Docker底层原理 2.Docker常用命令2.1 帮助命令2.2 镜像命令2.3 容器命令2.4 其他常用命令 3.小练习3.1 Docker下安装Nginx3.2 Docker安装Tomcat…

[网络安全提高篇] 一二〇.恶意软件动态分析经典沙箱Cape批量提取动态API特征

终于忙完初稿,开心地写一篇博客。 “网络安全提高班”新的100篇文章即将开启,包括Web渗透、内网渗透、靶场搭建、CVE复现、攻击溯源、实战及CTF总结,它将更加聚焦,更加深入,也是作者的慢慢成长史。换专业确实挺难的,Web渗透也是块硬骨头,但我也试试,看看自己未来四年究…