rocketmq源码-broker接收消息

news2024/11/28 9:26:06

前言

这篇笔记,主要记录producer在通过netty发送了请求之后,在broker这边是如何处理的消息的

org.apache.rocketmq.remoting.netty.NettyRemotingServer.NettyServerHandler#channelRead0
这里是broker的nettyServer端接收客户端发送消息的入口,不解释为什么会是这个类了

在内部调用的时候,调用链是这样的
org.apache.rocketmq.remoting.netty.NettyRemotingAbstract#processMessageReceived
	org.apache.rocketmq.remoting.netty.NettyRemotingAbstract#processRequestCommand
		org.apache.rocketmq.broker.processor.SendMessageProcessor#processRequest(在这里会判断当前消息是批量消息/单条消息)
			org.apache.rocketmq.broker.processor.SendMessageProcessor#sendMessage(在这里会区分当前消息是普通消息/事务消息)
				org.apache.rocketmq.store.DefaultMessageStore#putMessage
					org.apache.rocketmq.store.CommitLog#putMessage

因为这中间链路的逻辑,看的不多,所以暂时先只是把调用链路梳理出来,先看核心逻辑

CommitLog#putMessage

延迟消息的判断

在这里插入图片描述
上面的截图,是在broker接收到消息,真正开始处理时,做的第一个比较重要的判断逻辑,如果当前消息是延迟消息,会把当前业务上指定的topic和计算出来的queueId进行替换,替换成对应延迟级别的topic和queueId
需要注意的是:这里将业务上指定的topic和queueId暂时存入到了msg的property属性中,在后面延迟消息到期之后,会从这个property属性中取出来,然后再放到topic和queueId上

mappedFile.appendMessage()

在这里插入图片描述
这是第二个关键点:将消息追加到mappedFile中,我们通常说,rocketmq使用零拷贝,提高响应速度,我觉得应该就体现在这里
这里append的细节,还没有仔细看,所以暂时先不展开说,总之,我认为这里是把消息追加到内存中

在这里插入图片描述

接着来看最后两个关键的点:文件刷盘和主从同步

文件刷盘机制

在文件刷盘机制,分为异步和同步

所谓的同步刷盘,就是master节点在收到消息之后,在写到内存中之后,需要持久化到磁盘文件上,才会返回给producer处理完成
异步刷盘是指:master节点接收到消息之后,在写入到内存中之后,就返回给producer处理完成;然后通过异步线程将消息从内存写入到磁盘文件,在下面的截图中可以看到,对于异步刷盘,只是去唤醒了刷盘线程,对于主线程来说,就结束了,就会继续下一个操作

在这里插入图片描述
if判断逻辑中是同步刷盘的逻辑,else中是异步刷盘的逻辑

异步刷盘的逻辑中,也细分为了两类,一种是开启了transientStorePoolEnable, 一种是未开启transientStorePoolEnable

//异步刷盘且未开启TransientStorePool的处理逻辑
org.apache.rocketmq.store.CommitLog.FlushRealTimeService

//异步刷盘且开启TransientStorePool的处理逻辑
org.apache.rocketmq.store.CommitLog.CommitRealTimeService

// 同步刷盘处理逻辑
org.apache.rocketmq.store.CommitLog.GroupCommitService

这三个service,都是间接实现了Runnable接口,所以其核心逻辑,都在其run方法中

同步刷盘

在同步刷盘的时候

  1. 初始化service对象:GroupCommitService
  2. 构建request对象:GroupCommitRequest
  3. 把request对象放入到list集合中
  4. request.waitForFlush等待刷盘完成

其中在第三步,把请求放到list集合中之后,会唤醒刷盘线程进行刷盘,具体细节,我们来看下

在这里插入图片描述

这里的waitPoint是在什么用到的呢?在下面run方法中的waitForRunning()
所以,对于同步刷盘来说,在调用putRequest()的时候,会唤醒刷盘线程进行同步刷盘

接着来看刷盘的逻辑
在这里插入图片描述

这里可以看到,核心逻辑是在doCommit()方法中

在这里插入图片描述

在这里,有几重逻辑处理
1.从requestRead中取出来当前写磁盘的请求
2.判断当前要写磁盘的数据,是否已经在被刷到磁盘中
3.如果未被持久化,就进行刷盘的操作

这里flush的逻辑就不看了,底层就是调用mappedByteBuffer.force()方法强制将内存中的数据写入到磁盘

异步刷盘-FlushRealTimeService

在这里插入图片描述
异步刷盘的时候,会判断当前是否有配置定时刷盘以及刷盘周期,然后再判断,当上次刷盘时间超过最大刷盘时间之后,也会触发刷盘的逻辑
然后在刷盘的时候,底层调用的是:fileChannel.force() 或者是mappedBuyeBuffer.force()

CommitRealTimeService异步刷盘的逻辑和FlushRealTimeService的类似,只是底层在持久化的时候,CommitRealTimeService是通过调用fileChannel.write()方法进行写数据的

主从同步

handleHA这个方法,暂时还没有看明白主从同步的细节,待后面再补充

总结

对于broker在接收到消息之后,会经过一系列的判断,比如:当前消息类型是事务消息?批量消息?普通消息?,一些合法性的校验就不说了
然后在校验之后,真正开始进行处理的时候,会先处理延迟消息,将延迟消息的topic和queuId进行一层替换
然后再进行持久化、写磁盘的操作
最后会进行主从节点数据的同步

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

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

相关文章

Android中GRPC的使用-4种通信模式

GRPC的通信模式 GRPC四种基础通信模式:一元RPC、服务器端流RPC、客户端流RPC以及双向流RPC。下面分别四种模式进行介绍,并在Android环境中来实现服务和客户端。 一元RPC 一元RPC模式也被称为简单RPC模式。在该模式中,当客户端调用服务端的远程…

破记录!国产数据库KunDB 单节点TPC-C事务性能超180万tpmC

近日,星环科技KunDB在TPC-C事务性能测试中,采用常规国产服务器,实现了单节点tpmC超180万,体现其世界级领先的事务处理能力。 TPC-C是全球 OLTP 数据库最权威的性能测试基准,由TPC组织(国际事务性能委员会&…

【数字IC基础】TestBench功能

文章目录 一、TestBench的目的?二、TestBench的功能?三、TestBench(验证)的四要素?一、TestBench的目的? 对使用硬件描述语言(HDL)设计的电路(DUT)进行仿真验证,测试设计电路的功能、部分性能是否符合预期二、TestBench的功能? TestBench和DUT的关系是一个马蹄形结…

React - 项目初始化设置

React - 项目初始化设置一. 页面零边距二. 路径别名配置三. 安装使用 scss四. 安装 router一. 页面零边距 可以手写 css 重置页面样式,也可使用 reset-css 自动配置 手写样式不多说,这里使用 reset-css 安装依赖 yarn add reset-css src/App.js 文件中引…

阿里技术人分享的三本书豆瓣评分8.5分,让你的架构思维略窥门径

又逢“金九银十”,年轻的毕业生们满怀希望与忐忑,去寻找、竞争一个工作机会。已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇、更大的平台。 然而,面试人群众多,技术市场却相对冷淡,…

ssm+Vue计算机毕业设计校园疫情管理系统(程序+LW文档)

ssmVue计算机毕业设计校园疫情管理系统(程序LW文档) 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技…

我用了几行代码就实现了界面变灰效果

前言 前段时间,各个大厂的 App 首页都变成了灰色,网上还有不少人问界面变灰怎么做到的。有人说是后台换了图片,这个回答显然是不懂技术了,对于个性化推荐系统来说,使用的图片那么多张,怎么可能一一替换。还有一种说法是说后台将图片处理后再返回给前端的,这个显然也不太…

$ORACLE_BASE和$ORACLE_HOME下xml文件误删

问题描述: 某项目安装环境grid管理的oracle,环境已经搭建好许久,执行上线检查PSU版本时发现opatch lsinventory报错 但实例的sqlpatch显示已经应用成功且oracle client版本也显示为19.13 怀疑是Central Inventory(/oracle/oraInv…

【知识图谱】(task4)知识图谱的抽取和构建

note CRF条件随机场是全局最优(判别式模型),HMM是局部最优(生成式模型)实体关系抽取方法概览: 事件抽取主要分为事件的发现和分类和事件要素抽取两部分,又可以细分为触发词识别与事件分类和要素…

第13部分 VLAN,Trunk 和VTP

目录 13.1 VLAN,Trunk 和VTP 简介 13.1.1 VLAN 13.1.2 Trunk 13.1.3 VTP 13.1.4 EtherChannel 13.2 实验1:划分VLAN 1.实验目的 2.实验拓扑 3.实验步骤 4.实验调试 13.3 实验2:Trunk 配置 1.实验目的 2.实验拓扑 3.实验步骤 1…

SpringBoot整合Graylog做日志收集

日志收集折腾过程 ELK 之前整合过ELK做日志采集,就是Elasticsearch Logstash Kibana: Elasticsearch:存储引擎,存放日志内容,利于全文检索Logstash:数据传输管道,将日志内容传输到Elastics…

无法在Anaconda环境中使用pre-commit run --all-files:缺少匹配版本的ruamel.yaml

参考来源:https://stackoverflow.com/questions/68794749/unable-to-run-pre-commit-in-anaconda-environment 问题 与电脑两地隔离了半个月,今天开机commit的时候忽然弹出了下面的错误(自己图忘存了,图源置顶链接)&…

b站黑马的Vue快速入门案例代码——小黑记事本

目录 目标效果: 重点原理: (1)push()方法——向数组末尾,添加新元素,并返回新长度 (2)v-on可以传递自定义参数,v-on:click”...“的简写是clic…

jdk11新特性——标准Java异步HTTP客户端

目录一、概述二、HTTP Client 同步发送请求使用示例2.1、创建简单的服务端2.2、创建HTTP Client 同步代码三、HTTP Client 异步发送请求使用示例3.1、创建简单的服务端(参考2.1)3.2、创建HTTP Client 异步代码一、概述 Java 9 开始引入的一个处理 HTTP …

浅谈ioremap,vmalloc,mmap三者之间的脉络

前言 系统mmu开启后, 程序对内存的访问都是虚拟地址, 之后mmu会自动将虚拟地址变为实际的物理地址(硬件行为), 所以我们的程序如果要访问物理地址的话,必须要通过mmu建立虚拟地址与物理地址之间的映射关系。对于虚拟地址映射到物理地址的操作…

非零基础自学Golang 第7章 函数 7.6 延迟执行语句 7.7 小结

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.6 延迟执行语句7.7 小结第7章 函数 7.6 延迟执行语句 Go语言中存在一种延迟执行的语句,由defer关键字标识,格式如下: defer 任意语句defer后的语句不会被马上执行,在…

Redis持久化详解

一、概述 在Redis中,实现高可用的技术主要包括持久化、复制、哨兵和集群,下面分别说明它们的作用,以及解决了什么样的问题。 持久化:持久化是最简单的高可用方法(有时甚至不被归为高可用的手段),主要作用是数据备份…

springboot整合系列之如何选择版本及项目搭建

特别说明:本次项目整合基于idea进行的,如果使用Eclipse可能会略有不同。因为我很久没用过eclipse了,所以也没有办法给出两个版本。如果不一致的地方就自行google解决吧~~ springboot整合之如何选择版本及项目搭建 springboot整合mybatis-pl…

ADI Blackfin DSP处理器-BF533的开发详解52:图像处理专题-CMOS摄像头采集图像(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 板卡上设计了一个摄像头接口,可以连接与板卡匹配的 ADSP-EDU-CMOS 子卡板。摄像头接口采用 20PIN 插针接入,将插…

照片变漫画怎么做?分享这几个照片变漫画的技巧给你

大家在网上是否有看到过一些绘画博主给别人画漫画图呢?这些图片中的人物形象与现实中的非常相像,而且看起来真的很像漫画中的人物一般,画出来对于一些没有绘画功底的人来说是比较困难的。那么我们又该如何得到我们在漫画中的图片呢&#xff1…