基于电商场景的高并发RocketMQ实战-Broker写入读取流程性能优化总结、Broker基于Pull模式的主从复制原理

🌈🌈🌈🌈🌈🌈🌈🌈
【11来了】文章导读地址:点击查看文章导读!
🍁🍁🍁🍁🍁🍁🍁🍁

Broker 写入读取流程性能优化总结

Broker 的物理存储结构主要是为了优化三个方面:写入、存储、读取

写入优化:

  1. 将消息数据写入到 Commitlog 中默认就是写入到了操作系统的 page cache 中,通过 mapped file 机制来实现,将磁盘文件 Commitlog 映射成一块内存区域,将数据写入到内存的 page cache 中就算写入完成了,等待后台线程将内存数据 异步刷入磁盘 即可,这种情况下只有 Broker 所在的机器宕机了,才会导致几百毫秒内的内存数据丢失,这种概率是很小的
  2. Broker 存储数据是主要有三个结构的:Commitlog、ConsumeQueue、IndexFile,可参考文章,数据写入到 Commitlog 中的速度是很快的,再通过 异步 将 Commitlog 中的数据建立成索引写入到 ConsumeQueue、IndexFile,这个过程是异步,对写消息流程没有性能影响,即使写入到 ConsumeQueue、IndexFile 的过程中宕机了,只要 Commitlog 文件还在,Broker 重启之后,就会继续向 ConsumeQueue、IndexFile 中写入索引

存储结构:

  1. ConsumeQueue 存储结构经过了极大的优化设计的。每个消息在 ConsumeQueue 中存储的都是 定长的 20B ,每个 ConsumeQueue 文件可以存储 30w 个消息
  2. Commitlog 存储结构也是精心设计,每个文件 默认 1GB ,满了之后就存下一个文件,避免了某个文件过大,并且每一条消息在所有的 Commitlog 中 记录了有偏移量 ,Commielog 的文件名就是这个文件第一条消息的总物理偏移量

读取优化:

  1. 根据消息逻辑偏移量,来定位到 ConsumeQueue 的磁盘文件,在磁盘文件里就可以根据 逻辑偏移量 计算出 物理偏移量 ,可以直接定位到消息在 Commitlog 中的物理偏移量,通过两次定位就可以读取出数据
  2. 通过 transiendStorePoolEnabled 机制 解决了高并发读写场景下的 Broker busy 问题,实现了读写分离

Broker 基于 Pull 模式的主从复制原理

Broker 主从复制基于 Pull 模式实现的,即生产者将数据写入到 Broker 主节点之后,等待 Slave 向 Master 发送请求,主动拉取数据

Broker 的从节点需要拉取数据时,会向主节点发送请求建立连接,当建立连接之后,在主节点会建立一个 HAConnection 的数据结构,用于将与从节点之间的连接抽象出来,而在从节点会创建两个 HAClient,一个是主从请求线程,另一个是主从响应线程,HAClient 是从节点的核心类,负责与主节点创建连接与数据交互

那么当从节点向主节点发送连接建立,建立好连接之后,Slave 会向 Master 发送一个最大偏移量 Max Offset,那么主节点根据这个 Offset 偏移量去磁盘文件中读取数据,并将数据发送到 Slave,Slave 进行数据的保存,总体流程如下图:

在这里插入图片描述

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

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

相关文章

C++多线程入门笔记

参考&#xff1a; https://blog.csdn.net/qq_44891434/article/details/132559929 https://www.cnblogs.com/chen-cs/p/13055211.html #include <thread> std::thread t(function_name, args...);function_name是线程入口点的函数或可调用对象 args…是传递给函数的参数…

【Spark精讲】一文讲透SparkSQL执行过程

SparkSQL执行过程 逻辑计划 逻辑计划阶段会将用户所写的 SQL语句转换成树型数据结构(逻辑算子树)&#xff0c; SQL语句中蕴含的逻辑映射到逻辑算子树的不同节点。 顾名思义&#xff0c;逻辑计划阶段生成的逻辑算子树并不会直接提交执行&#xff0c;仅作为中间阶段 。 最终逻辑…

c# 设置文件夹隐藏

在C#中&#xff0c;你可以使用DirectoryInfo类的Attributes属性来设置文件夹的隐藏属性。以下是一个示例代码&#xff1a; using System; using System.IO;class Program {static void Main(string[] args){string folderPath "你的文件夹路径"; // 替换为你要隐藏…

二、KMDF开发之HelloWord

目录 第一步、创建KMDF项目 第二步、代码里增加打印信息 最终我们是要自己开发PCIE驱动&#xff0c;这里使用HelloWord工程把整个环境打通&#xff0c;下一篇将讲KMDF双机调试环境的搭建&#xff0c;开发环境的搭建见上一篇博文《一、KMDF开发之环境搭建-CSDN博客》。 第一步…

关键字:abstract关键字

在 Java 中&#xff0c;abstract是一个关键字&#xff0c;用于修饰类和方法。当一个类被声明为抽象类时&#xff0c;它不能被实例化&#xff0c;只能被其他类继承。同时&#xff0c;抽象类可以包含抽象方法&#xff0c;抽象方法没有方法体&#xff0c;只包含方法的签名&#xf…

docker-compose 安装gitlab

写在前面的话&#xff1a;docker-compose的文件是通用的&#xff0c;因此可以切换任意版本的gitlab的镜像版本。 往期docker-compose部署系列如&#xff1a; docker-compose语法格式docker-compose部署openldapdocker-compose 安装Sonar并集成gitlab 文章目录 1. 参考文档2. 环…

java spring boot 自定义 aop

以一个锁的加锁和释放为例 1、先定义注解 /*** 锁切面* author fmj*/ Retention(RetentionPolicy.RUNTIME) Target(ElementType.METHOD) public interface VersionLockAOP { }2、然后定义切面类以及切点 /*** 切面*/ Component Aspect Slf4j public class VersionLockAOPAspe…

Spring AOP<一>简介与基础使用

spring AOP 基础定义 含义使用切面组织多个Advice,Advice放在切面中定义。也就是说是定义通知的自定义类。自定义的AOP类Aspect连接点方法调用&#xff0c;异常抛出可以增强的点JoinPoint &#xff1a;也就是**被增强的方法的总称&#xff0c;可以获取具体方法的信息&#xff…

SSRF靶场安装测试记录

目录 环境 靶场介绍 1. 获取并显示指定文件内容的应用程序代码

Navicat删除连接报错:service in use cannot be deleted的解决方法

我在删除连接时遇到了这个报错&#xff0c;内容如图。下面我介绍两种解决方法&#xff0c;非常简单。 第一种 右键点击想要删除的连接&#xff0c;先选择“关闭连接”。再选择“删除连接” 第二种 如果第一种方法无效&#xff0c;直接关闭Navicat软件&#xff0c;重新打开。然后…

WPF 基础入门(样式)

3.1 一般样式 <Grid Margin"10"><TextBlock Text"Style test" Foreground"Red" FontSize"20"/> </Grid> 3.2内嵌样式 直接在控件上定义样式&#xff0c;如下所示&#xff1a; <Grid Margin"10">…

【c/c++】指针例图基础详解

文章目录 指针变量内存指针详解例1例2练习&答案解析 指针变量内存 int main(){// 各类型变量占字节数printf("char: %d\n",sizeof(char)); // 1printf("short: %d\n",sizeof(short)); // 2printf("int: %d\n",sizeof(int)); // 4pri…

uniapp多级动态表单规则

最近有个新的业务、主要涉及多层级的动态表单提交&#xff0c;其中又涉及很多类型&#xff0c;踩了很多坑之后&#xff0c;终于研发完毕。 传来的数据格式处理 传来的数据格式涉及比较多的内容&#xff0c;以下举例一个&#xff0c;涉及到规则的填写 规则写法有两种&#xff…

算法基础之蒙德里安的梦想

蒙德里安的梦想 核心思想&#xff1a; 状态压缩dp 总方案 横放的方案 剩下的地方竖着放是固定的了 状态压缩 &#xff1a; 将每一列的图(横终点 横起点 竖) 用一个二进制数存下 向后凸的为1 反之为0 状态计算&#xff1a; 所有 i – 1 列 不冲突的 都加和 f[i , j] f[i - 1…

lodop打印控件使用

功能演示 - Lodop和C-Lodop官网主站 云官网 : Lodop和C-Lodop官网主站 官网 : Lodop和C-Lodop官网主站 &#xff08;建议网速不怎么样的&#xff0c;不要使用这个网站了&#xff09; 这个就不用多讲了&#xff0c;当然云官网的速度要快一些&#xff0c;里面的内容展示方式都是…

小程序域名SSL证书能否用免费的?

在小程序开发中&#xff0c;确保通信安全性是至关重要的一环&#xff0c;而SSL证书正是为此提供了有效的保障。SSL证书通过加密数据传输&#xff0c;防止数据被中间人恶意窃取或篡改&#xff0c;为用户和应用提供了更安全的通信环境。 针对小程序域名的SSL证书&#xff0c;通常…

【HTML5】第1章 HTML5入门

学习目标 了解网页基本概念&#xff0c;能够说出网页的构成以及网页相关名词的含义 熟悉Web标准&#xff0c;能够归纳Web标准的构成。 了解浏览器&#xff0c;能够说出各主流浏览器的特点。 了解HTML5技术&#xff0c;能够知道HTML5发展历程、优势以及浏览器对HTML5的支持情…

PINNs解麦克斯韦方程

1 问题介绍 麦克斯韦方程控制着光的传播及其与物质的相互作用。因此&#xff0c;利用计算电磁学模拟求解麦克斯韦方程对理解光与物质相互作用和设计光学元件起着至关重要的作用。对于线性、非磁性、各向同性材料没有电、磁电流密度的方程通常可以写成如下形式&#xff1a; 2 物…

C# WPF上位机开发(Web API联调)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多时候&#xff0c;客户需要开发的不仅仅是一个上位机系统&#xff0c;它还有其他很多配套的系统或设备&#xff0c;比如物流小车、立库、数字孪…

【toolschain】关于anaconda安装包时候 系统级全局安装还是安装在虚拟环境里的问题总结

关于安装方式决定所被安装环境的问题 借机会研究了一下 关于处在anaconda虚拟环境下的 安装方式的不同 安装路径不同的问题&#xff0c;并总结如下原则&#xff1a; conda 无法管理或者conda库查不到的&#xff0c;自然只能通过其他方式安装&#xff0c;那么路径就不在虚拟环…