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

news2024/11/18 19:51:42

Broker主从同步流程

配置数据同步流程

配置数据包含4种类型:Topic配置、消费者位点、延迟位点、订阅关系配置。每种配置数据由一个继承自ConfigManager的类来管理,继承关系如图。Slave如何从Master同步这些配置呢?我们先来看一下初始化服务的步骤
在这里插入图片描述

  • 第一步:Master Broker在启动时,初始化一个BrokerOuterAPI,这个服务的功能包含Broker注册到Namesrv、Broker从Namesrv解绑、获取Topic配置信息、获取消费者位点信息、获取延迟位点信息及订阅关系等。
  • 第二步:Slave Broker在初始化Controller的定时任务时,会初始化SlaveSynchronize服务,每60s调用一次SlaveSynchronize.syncAll()方法
  • 第三步:syncAll()方法依次调用4种配置数据(Topic配置、消费者位点、延迟位点、订阅关系配置)的同步方法同步全量数据
    在这里插入图片描述
  • 第四步:syncAll()中执行的4个方法都通过Remoting模块同步调用BrokerOuterAPI,并从Master Broker获取数据,保存到Slave中
  • 第五步:Topic配置和订阅关系配置随着保存内存信息的同时持久化到磁盘上;消费者位点通过BrokerController初始化定时任务持久化到磁盘上;延迟位点信息通过ScheduleMessageService定时将内存持久化到磁盘上
    在这里插入图片描述

CommitLog数据同步流程

CommitLog的数据同步分为同步复制和异步复制两种。
同步复制是指生产者生产消息后,等待Master Broker将数据同步到Slave Broker后,再返回生产者数据存储状态;异步复制是指生产者在生产消息后,不用等待Slave同步,直接返回Master存储结果
在这里插入图片描述

  • 异步复制
    Master Broker启动时会启动HAService.AcceptSocketService服务,当监听到来自Slave的注册请求时会创建一个HAConnection,同时HAConnection会创建ReadSocketService和WriteSocketService
    两个服务并启动,开始主从数据同步。ReadSocketService接收Slave同步数据请求,并将这些信息保存在HAConnection中WriteSocketService根据HAConnection中保存的Slave同步请求,从CommitLog中查询数据,并发送给Slave.
    注:ReadSocketService和WriteSocketService是两个独立工作的线程服务,它们通过HAConnection中的公共变量将CommitLog同步给Slave

slaveRequestOffset表示Slave请求同步的位点值;
slaveAckOffset表示slave已经保存的位点值
在这里插入图片描述

  • 同步复制
    在CommitLog将消息存储到PageCache后,会调用CommitLog的handleHA()/submitReplicaRequest方法处理同步复制。
    当BrokerRole配置为SYNC_MASTER时表示当前Master Broker需要同步将消息"发送"到Slave.根据Master Broker CommitLog
    的存储结果构造一个GroupCommitRequest放入HAService中,再将GroupComitRequest放入GroupTransferService服务中,
    等待GroupTransferService同步成功的锁。如果同步成功那么GroupCommit中的锁会被唤醒,并设置flushOK为True,表示生产
    者发送的消息被Master Broker和Slave Broker 同时保存。
    一个Master Broker可以配置多个Slave Broker,当需要同步数据时,通过service.getWaitNotifyObject().wakeupAll()来唤醒全部的Slave同步。虽然多个Slave都同步了数据,但是一旦Master Broker不可用时,消费者只会从一个Slave中拉取消息,所以生产环境建议Slave不要配置太多。
    注:Slave在发送请求数据的Request时,会带上Slave请求的位点HAConnection.slaveRequestOffset,该值如果等于-1(默认),则表示没有Slave请求过位点数据
    在这里插入图片描述
  • ReadSocketService后台服务不断接收Slave Broker上报的offset,每上报一次都通知HAService.notifyTransferSome()方法,判断Slave同步的位点是否大于Master标记的已同步位点,如果大于则更新标记值,同时通知同步复制服务GroupTransferService.
    GroupTransferService扫描所有的同步请求,依次判断哪些GroupCommitRequest的待同步复制的位点是比已同步位点小的,
    释放GroupCommitRequest中的锁,消息处理线程可以将消息存储成功的结果返回给生产者
  • 消费队列文件(ConsumeQueue)和索引文件(IndexFile)这两个文件是在SlaveBroker上追加CommitLog后由ReputMessageService进行创建的,所以不需要同步

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

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

相关文章

【JavaEE进阶】图书管理系统开发日记——捌

文章目录 🍃前言🎍统一数据返回格式🚩快速入门🚩存在问题🎈问题原因🎈代码修改 🚩统一格式返回的优点 🍀统一异常处理🌲前端代码的修改🚩登录页面&#x1f6a…

openai.CLIP多模态模型简介

介绍 OpenAI CLIP(Contrastive Language–Image Pretraining)是一种由OpenAI开发的多模态学习模型。它能够同时理解图像和文本,并在两者之间建立联系,实现了图像和文本之间的跨模态理解。 如何工作 CLIP模型的工作原理是将来自…

三、软考-系统架构设计师笔记-计算机系统基础知识

计算机系统概述 计算机系统是指用于数据管理的计算机硬件、软件及网络组成的系统。 它是按人的要求接收和存储信息,自动进行数据处理和计算,并输出结果信息的机器系统。 冯诺依曼体系计算机结构: 1、计算机硬件组成 冯诺依曼计算机结构将…

C#理论 —— WPF 应用程序Console 控制台应用

文章目录 1. WPF 应用程序1.1 工程创建1.2 控件1.2.1 控件的公共属性1.2.1 TextBox 文本框1.2.1 Button 按钮 *. Console 控制台应用1.1 工程创建 1. WPF 应用程序 1.1 工程创建 Visual Studio 中新建项目 - 选择WPF 应用程序; 1.2 控件 1.2.1 控件的公共属性 …

2024常用的 Python 自动化测试框架有哪些?

Unittest是Python中最常用的测试框架之一,它提供了丰富和强大的测试工具和方法,可以帮助开发者更好地保证代码质量和稳定性,本文就来介绍下Unittest单元测试框架。 1. 介绍 unittest是Python的单元测试框架,它提供了一套丰富的测…

【MySQL】基本查询(表的增删改查)-- 详解

CRUD:Create(创建),Retrieve(读取),Update(更新),Delete(删除)。 一、Create insert [into] table_name [(column [, column] ...)] v…

硬件工程师入门基础知识(三)钽电容应用(二)

钽电容应用(二) 1.钽电容使用容量选择2.非固体电解质钽电容器使用时应注意的问题2.1 容量和损耗2.2 直流漏电流2.3 使用电压2.4 反向电压2.5 纹波电流2.6 失效率的影响因素2.7 补充说明: 1.钽电容使用容量选择 许多情况下,高能混…

自定义Chrome的浏览器开发者工具DevTools界面的字体和样式

Chrome浏览器开发者工具默认的字体太小,想要修改但没有相关设置。 外观——字体可以自定义字体,但大小不可以调整。 github上有人给出了方法 整理为中文教程: 1.打开浏览器开发者工具,点开设置——实验,勾上红框设…

实现unity场景切换

本文实现两个按键实现场景1和场景2之间的切换 ①首先在unity 3D中创建两个场景,分别为Scene1和Scene2 ②在Scene1中创建一个Button,修改txt内容为“To Scene2”,并在Buttons下创建一个空物体,用于挂载脚本。 脚本Trans Scene.…

自然语言:信息抽取技术在CRM系统中的应用与成效

一、引言 在当今快速变化的商业环境中,客户关系管理(CRM)已成为企业成功的关键因素。CRM系统的核心在于有效地管理客户信息,跟踪与客户的每一次互动,以及深入分析这些数据以提升客户满意度和忠诚度。在我最近参与的一个…

综合实战(volume and Compose)

"让我,重获新生~" MySQL 灾难恢复 熟练掌握挂载卷的使用,将Mysql的业务数据存储在 外部。 实战思想: 使用 MySQL 5.7 的镜像创建容器并创建一个普通数据卷 "mysql-data"用来保存容器中产生的数据。我们需要容器连接到Mysql服务&a…

智慧公厕:打造智慧城市环境卫生新标杆

随着科技的不断发展和城市化进程的加速推进,智慧城市建设已经成为各地政府和企业关注的焦点。而作为智慧城市环境卫生管理的基础设施,智慧公厕的建设和发展也备受重视,被誉为智慧城市的新标杆。本文以智慧公厕源头厂家广州中期科技有限公司&a…

OpenAI要为GPT-4解决数学问题了:奖励模型指错,解题水平达到新高度

原文:OpenAI要为GPT-4解决数学问题了:奖励模型指错,解题水平达到新高度 - 知乎 对于具有挑战性的 step-by-step 数学推理问题,是在每一步给予奖励还是在最后给予单个奖励更有效呢?OpenAI 的最新研究给出了他们的答案。…

LASSO算法

LASSO (Least Absolute Shrinkage and Selection Operator) 是一种回归分析的方法,它能够同时进行变量选择和正则化,以增强预测准确性和模型的解释性。LASSO通过在损失函数中加入一个L1惩罚项来实现这一点。该惩罚项对系数的绝对值进行约束。 基本概念 …

前后端延迟怎么解决

当今互联网应用的发展越来越迅猛,用户对于网站或应用的性能要求也越来越高。其中一个重要方面就是前后端延迟的解决,也就是减少前端与后端之间的通信时间延迟,提高用户体验。本文将详细介绍如何解决前后端延迟的问题。 网络延迟 数据在网络…

springboot项目中使用mybatis作为数据查询框架,如何实现查询sql的日志打印输出?

在Spring Boot项目中使用MyBatis作为数据查询框架时,可以通过配置日志记录器来实现SQL查询的日志打印输出。MyBatis支持多种日志框架,如SLF4J、Log4j2等。这里介绍几种常见的配置方法: 1. 使用application.properties或application.yml配置 …

如何开通微信小程序商城

微信小程序店铺是一种新型的线上商城,可以帮助商家快速搭建自己的线上销售平台,吸引更多的用户进行购买。作为小程序服务商,我们可以帮助商家开通微信小程序店铺,提升他们的线上销售业绩。 1. 进入采云小程序。进入采云小程序首页…

skiplist(高阶数据结构)

目录 一、概念 二、实现 三、对比 一、概念 skiplist是由William Pugh发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》 skiplist本质上是一种查找结构,用于解决算法中的查找问题,…

ntp时钟服务安装- 局域网节点时间同步

场景: 一般部署大数据相关应用服务,各个节点之间需要时间同步;内网情况下,很可能各节点之前时间可能不一致,或者过一段时间后 又不一致了 ntp 时钟服务器: 可用于内网各个节点之前得时间同步,安…

C#理论 —— 基础语法、数据类型、变量、常量、运算符、三大结构

文章目录 1. 基础语法1.1 标识符命名规则1.2 C# 关键字1.3 C#注释 2. 数据类型2.1 值类型(Value types)2.2 引用类型(Reference types)2.2.1 对象(Object)类型3.2.2 动态(Dynamic)类…