消息中间件之RocketMQ源码分析(十六)

news2024/11/19 18:27:02

Broker读写分离机制

在RocketMQ中,有两处地方使用了"读写分离"机制

  • Broker Master-Slave读写分离:写消息到Master Broker,从Slave Broker读取消息。Broker配置为Slave Broker读取消息。
    Broker配置为slaveReadEnable=True(默认False),消息占用内存百分比配置为accessMessageInMemoryMaxRatio=40(默认40)

  • Broker Direct Memory-Page Cache读写分离:写消息到Direct Memory(直接内存,简称DM),从操作系统的PageCache中读取消息。
    Master Broker配置读写分离开关为transientStorePoolEnable=True(默认False),写入DM存储数量,配置transientStorePoolSize至少大于0(默认为5,建议不修改),刷盘类型配置为flushDiskType=FlushDiskType.ASYNC_FLUSH,即异步刷盘

读写分离能够最大限度地提供吞吐量,同时会增加数据不一致的风险

Master-Slave读写分离机制。

通常Master提供读写处理,如果Master负载较高就从Slave读取
在这里插入图片描述
第一步:Broker在处理Pull消息时,计算下次是否从Slave拉取消息,是通过DefaultMessageStore.getMessage()方法实现的,
diff>memory 表示没有拉取的消息比分配的内存大,如果diff > memory的值为True,则说明此时Master Broker内存繁忙,应该选择从Slave拉取消息
在这里插入图片描述

  • maxOffsetPy:表示当前Master Broker存储的所有消息的最大物理位点
  • maxPhyOffsetPulling:表示拉取的最大消息位点
  • diff:是上面两者的差值,表示还有多少消息没有拉取
  • StoreUtil.TOTAL_PYHSICAL_MEMORY_SIZE:表示当前Master Broker全部的物理内存
  • memory:Broker认为可使用的最大内存,该值可以通过accessMessageInMemoryMaxRatio配置项决定,默认accessMessageInMemoryMaxRatio=40,如果物理内存为100MB,那么memory=40MB

第二步:通知客户端下次从哪个Broker拉取消息。在消费者Pull消息返回结果时,根据第一步设置的suggestPullingFromSlave值返回给消费者,该过程通过PullMessageProcessor.processRequest()方法实现。
通过查看以上代码,我们直到要想从Slave读取消息,需要设置slaveReadEnable=True,此时会根据第一步返回的suggestPullingFromSlave值告诉客户端下次可以从哪个Broker拉取消息。suggestPullingFromSlave=1表示从Slave拉取,suggestPullingFromSlave=0表示从Master拉取。
在这里插入图片描述

Direct Memory-Page Cache的读写分离机制

以上逻辑通过MappedFile.appendMessagesInner()方法来实现,核心代码如图
在这里插入图片描述
在这里插入图片描述
这段代码中,writeBuffer表示从DM中申请的缓存;mappedByteBuffer表示从PageCache中申请的缓存,如果Broker设置transientStorePoolEnable=true,并且异步刷盘,则存储层DefaultMessageStore在
初始化会调用TransientStorePool.init()方法(按照配置的Buffer个数)初始化writeBuffer

在这里插入图片描述
初始化writeBuffer后,当生产者将消息发送到Broker时,Broker将消息写入writeBuffer,然后被异步转存服务不断地从DM中Commit到Page中,消费者此时从哪儿读取数据呢?消费者拉取消息的实现在MappedFile.selectMappedBuffer()方法中
在这里插入图片描述
从代码中可以看到,消费者始终从mappedByteBuffer(即Pagecache)读取消息。

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

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

相关文章

力扣随笔之寻找重复数(中等287)

思路1:暴力解法,根据要求不修改数组且只用常量级O(1)的额外空间,我们写两层嵌套循环,寻找重复的数;可以解决部分问题,但会超出时间限制无论Java还是C; Java实现: class Solution {public int findDuplicat…

WSL里的Ubuntu 登录密码忘了怎么更改

环境: Win10 专业版 WSL2 如何 Ubuntu22.04 问题描述: WSL里的Ubuntu 登录密码忘了怎么更改 解决方案: 在WSL中的Ubuntu系统中,忘记了密码,可以通过以下步骤重置密码: 1.打开命令提示符或PowerShel…

[HTML]Web前端开发技术29(HTML5、CSS3、JavaScript )JavaScript基础——喵喵画网页

希望你开心,希望你健康,希望你幸福,希望你点赞! 最后的最后,关注喵,关注喵,关注喵,佬佬会看到更多有趣的博客哦!!! 喵喵喵,你对我真的很重要! 目录 前言 上一节的课后练习

Stable Diffusion 3重磅发布

刚不久,Stability AI发布了Stable Diffusion 3.0,这一版本采用了与备受瞩目的爆火Sora相同的DiT架构。通过这一更新,画面质量、文字渲染以及对复杂对象的理解能力都得到了显著提升。由于这些改进,先前的技术Midjourney和DALL-E 3在…

【Vue3】‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题 今天拿到别人项目的时候,我平时比较习惯用pnpm,我就使用pnpm i先下载依赖包,下载完成后,启动项目,就开始报以下错误! 但是当我执行pnpm i的时候,vite不应该就已经被我下载下来了吗 研究了…

vivo 基于 StarRocks 构建实时大数据分析平台,为业务搭建数据桥梁

在大数据时代,数据分析和处理能力对于企业的决策和发展至关重要。 vivo 作为一家全球移动互联网智能终端公司,需要基于移动终端的制造、物流、销售等各个方面的数据进行分析以满足业务决策。 而随着公司数字化服务的演进,业务诉求和技术架构有…

解密高并发系统设计:聊聊负载均衡算法

引言 随着公司业务的飞速发展,以及业务的多样性,用户数会迅猛增长,系统的流量会越来越大。因此,大规模的并发用户访问会对系统的处理能力造成巨大的压力,系统必须要有足够强的处理能力才能应对。 这篇文章就来介绍一…

VMware使用虚拟机,开启时报错:无法连接虚拟设备 0:0,因为主机上没有相应的设备。——解决方法

检查虚拟机配置文件并确保物理设备已正确连接。 操作: 选中虚拟机,打开设置,点击CD/DVD。在连接处选择使用ISO镜像文件

被动收入 | Audible 联盟营销计划:如何每月赚取 5000 美元?

你是否正在寻求被动收入的方式,或者在你的网站或平台上寻求赚钱的方式?亚马逊的Audible Depot联盟营销计划是一个不错的选择。作为会员,可以向听众推广有声读物,并从中获得收益。每月有可能赚取高达5000美元的收入,现在…

【Vuforia+Unity】AR04-地面、桌面平面识别功能(Ground Plane Target)

不论你是否曾有过相关经验,只要跟随本文的步骤,你就可以成功地创建你自己的AR应用。 官方教程Ground Plane in Unity | Vuforia Library 这个功能很棒,但是要求也很不友好,只能支持部分移动设备,具体清单如下: 01.Vuforia的地面识别功能仅支持的设备清单: Recommended…

【MySQL】MySQL从0到0.9 - 持续更新ing

MySQL SQL 基础 DDL 语句 show databases; show tables; desc table_name; # 获取表信息 show create table 表名; // 查询指定表的建表语句 数据类型 char(10) 不满10个会用空格填充,性能好一点 varchar(10) 变长字符串,性能差一点 CREATE TABLE tabl…

数据库-MySQL-01

这里写目录标题 数据库开发-MySQL首先来了解一下什么是数据库。1. MySQL概述1.1 安装1.1.1 版本1.1.2 安装1.1.3 连接1.1.4 企业使用方式(了解) 1.2 数据模型1.3 SQL简介1.3.1 SQL通用语法1.3.2 分类 2. 数据库设计-DDL2.1 项目开发流程2.2 数据库操作2.2.1 查询数据库2.2.2 创…

从SDRAM到DDR的变化

1、结构概述 在此之前,曾经通过一篇文章从SDRAM的内部芯片框图出发,分析过SDRAM的功能实现,本文开始继续分析DDR、DDR2、DDR3的芯片内部框图,从而认识他们各自的区别,便于后续使用。 下图时镁光的128Mb的SDRAM内存芯片…

大学生多媒体课程学习网站thinkphp+vue

开发语言:php 后端框架:Thinkphp 前端框架:vue.js 服务器:apache 数据库:mysql 运行环境:phpstudy/wamp/xammp等开发背景 (一) 研究课程的提出 (二)学习网站的分类与界定…

RabbitMq:RabbitMq 主从镜像模式②

一、模式思想 所有的技术设计思想,基本都在两点上下功夫:1. 生产力上 2. 稳定上 二、集群模式 今天又有人问起来rabbitmq的高可用方式,因为和常见的主从模式有点区别,所以就记录一下。 rabbitmq集群的镜像队列提供了更高级的主从…

数字化转型导师坚鹏:数据安全法解读与政府数字化转型

网络安全法、数据安全法、个人信息保护法解读与政府数字化转型 课程背景: 很多机构存在以下问题: 不清楚网络安全法、数据安全法、个人信息保护法立法背景? 不知道如何理解网络安全法、数据安全法、个人信息保护法政策? 不…

LeetCode 第一题: 两数之和

文章目录 第一题: 两数之和题目描述示例 解题思路Go语言实现 - 一遍哈希表法C实现算法分析 排序和双指针法Go语言实现 - 排序和双指针法C算法分析 暴力法Go语言实现 - 暴力法C算法分析 二分搜索法Go语言实现 - 二分搜索法C算法分析 第一题: 两数之和 ‍ 题目描述 给定一个整…

【统计分析数学模型】聚类分析: 系统聚类法

【统计分析数学模型】聚类分析: 系统聚类法 一、聚类分析1. 基本原理2. 距离的度量(1)变量的测量尺度(2)距离(3)R语言计算距离 三、聚类方法1. 系统聚类法2. K均值法 三、示例1. Q型聚类&#x…

变量与数据类型(详解版)

新年的第一篇博客,我也开始步入了对于java的学习,感觉c语言还是有很多的不懂,还是会继续学习c语言的,毕竟还是练习太少了! 话不多说,我们直接开整! 1. 字面常量 如上图中的输出语句&#xff0…

(202402)多智能体MetaGPT入门1:MetaGPT环境配置

文章目录 前言拉取MetaGPT仓库1 仅仅安装最新版2 拉取源码本地安装MetaGPT安装成果全流程展示 尝试简单使用1 本地部署大模型尝试(失败)2 讯飞星火API调用 前言 感谢datawhale组织开源的多智能体学习内容,飞书文档地址在https://deepwisdom.…