Rocketmq 一文带你搞懂rocketmq基础

news2024/11/25 2:21:50

1.集群架构

从上图可以看出来一共有4个部分,分别为Producer,Consumer,NameServer,Broker

 1.1 NameServer集群

虽然说NameServer是一个集群,但是每一个NameServer是独立的,不会相互同步数据,因为每个节点都会保存完整的数据,所以单个节点挂掉不会影响集群。

1.2Broker 

Broker 采用主从集群,实现多副本存储和高可用。每个 Broker 节点都要跟所有的 Name Server 节点建立长连接,定义注册 Topic 路由信息和发送心跳。跟所有 Name Server 建立连接,就不会因为单个 Name Server 挂了影响 Broker 使用。Broker 主从模式中, Slave 节点主动从 Master 节点拉取消息。

1.3Producer

生产者,Producer 跟 Name Server 的任意一个节点建立长连接,定期从 Name Server 拉取 Topic 路由信息。Producer 是否采用集群,取决于它所在的业务系统。

1.4 consumer

Consumer 跟 Name Server 的任意一个节点建立长连接,定期从 Name Server 拉取 Topic 路由信息。Consumer 是否采用集群,取决于它所在的业务系统。

Producer 和 Consumer 只跟任意一个 Name Server 节点建立连接,因为 Broker 会向所有 Name Server 注册 Topic 信息,所以每个 Name Server 保存的数据其实是一致的。

2.MessageQueue

producer发送的消息会在Broke中的MessageQueue中保存,保存的是消息的偏移量

有了 MessageQueue ,Topic 的消息就可以在 Broker 中实现分布式存储,如上图,Broker 集群中有 3 个 Broker,保存两个 Topic 的消息。每个 Broker 为 Topic 创建 4 个MessageQueue。

有了 MessageQueue,Producer 可以并发地向 Broker 中发送消息,Consumer 也可以并发地消费消息。

3.Consumer

图中,RocketMQ 集群中有两个 Broker,每个 Broker 上有 4 个 MessageQueue,Topic1 的消息并发写入了这 8 个 MessageQueue。

RocketMQ 通过 Consumer Group1 这个消费者组进行消息拉取。

一个消费者可以消费多个 MessageQueue,但是同一个 MessageQueue 只能被同一个消费者组的一个消费者消费。比如  MessageQueue0 只能被 Consumer Group1 中的 Consumer1 消费, 不能被其他消费者消费。

4.Broker高可用集群

Broker 通过主从集群来实现消息高可用。跟 Kafka 不同的是,RocketMQ 并没有 Master 节点选举功能,而是采用多 Master 多Slave 的集群架构。Producer 写入消息时写入 Master 节点,Slave 节点主动从 Master 节点拉取数据来保持跟 Master 节点的数据一致。

Consumer 消费消息时,既可以从 Master 节点拉取数据,也可以从 Slave 节点拉取数据。到底是从 Master 拉取还是从 Slave 拉取取决于 Master 节点的负载和 Slave 的同步情况。如果 Master 负载很高,Master 会通知 Consumer 从 Slave 拉取消息,而如果 Slave 同步消息进度延后,则 Master 会通知 Consumer 从 Master 拉取数据。总之,从 Master 拉取还是从 Slave 拉取由 Master 来决定。

如果 Master 节点发生故障,RocketMQ 会使用基于 raft 协议的 DLedger 算法来进行主从切换。

Broker 每隔 30s 向 Name Server 发送心跳,Name Server 如果 120s 没有收到心跳,就会判断 Broker 宕机了。

 5.消息存储

存储文件一共有三个:CommitLog,ConsumeQueue,Index

5.1CommitLog

Rocketmq的消息保存在CommitLog里面,CommitLog每个文件大小1G,文件名并不叫CommitLog,而是通过消息的偏移量来命名,比如第一个文件文件名是 0000000000000000000,第二个文件文件名是 00000000001073741824,依次类推就可以得到所有文件的文件名。

有了上面的命名规则,给定一个消息的偏移量,就可以根据二分查找快速找到消息所在的文件,并且用消息偏移量减去文件名就可以得到消息在文件中的偏移量。

RocketMQ 写 CommitLog 时采用顺序写,大大提高了写入性能。

5.2ConsumeQueue

如果从CommitLog里面检索一条消息效率会很低,这时候ConsumeQueue就会充当索引文件,会让检索效率大大提高

其实ConsumeQueue和MessageQueue是一一对应的关系,MessageQueue只是一个概念模型

 commitLogffset :记录消息在CommitLog中的偏移量

size:记录消息大小

tag hashCode: 这个很重要,假如一个Consumer订阅了TopicA,Tag1,Tag2,那这个Consumer的订阅关系如下:

可以看到,这个订阅关系是一个 hash 类型的结构,key 是 Topic 名称,value 是一个 SubscriptionData 类型的对象,这个对象封装了 tag。

拉取消息时,首先从 Name Server 获取订阅关系,得到当前 Consumer 所有订阅 tag 的 hashcode 集合 codeSet,然后从 ConsumerQueue 获取一条记录,判断最后 8 个字节 tag hashcode 是否在 codeSet 中,以决定是否将该消息发送给Consumer。

5.3index文件

因为Rocketmq支持消息的属性查找消息,所以出现了index文件 index文件由三个部分组成

文件头,indexhead 500W个hash槽,和2000W个Index条目组成

 5.3.1 indexhead

由6部分组成

前两个元素代表是这个index文件中第一条消息和最后一条消息的罗盘时间

第三个第四个元素是表示当前index文件中第一条消息和最后一条消息在Commitlog中的物理偏移量,

第五个元素代表还有多少hash槽数量

第六个元素表示当前index文件中索引条数的数量

查找的时候除了传入 key 还需要传入第一条消息和最后一条消息的落盘时间,这是因为 Index 文件名是时间戳命名的,传入落盘时间可以更加精确地定位 Index 文件。

5.3.2hash槽

熟悉 Java 中 HashMap 的同学应该都比较熟悉 Hash 槽这个概念了,其实就是 Hash 结构的底层数组。Index 文件中的 Hash 槽有 500 万个数组元素,每个元素是 4 个字节 int 类型元素,保存当前槽下最新的那个 index 条目的序号。

hash槽解决hash冲突的方法是链表法

5.3.3Index条目

每个 Index 条目中,key 的 hashcode 占 4 个字节,phyoffset 表示消息在 CommitLog 中的物理偏移量占 8 个字节,timediff  表示消息的落盘时间与 header 里的 beginTimestamp 的差值占 4 个字节,pre index no 占 4 个字节。

re index no 保存的是当前的 Hash 槽中前一个 index 条目的序号,一般在 key 发生 Hash 冲突时才会有值,否则这个值就是 0,表示当前元素是 Hash 槽中第一个元素。

Index 条目中保存 timediff,是为了防止 key 重复。查找 key 时,在 key 相同的情况下, 如果传入的时间范围跟 timediff 不满足,则会查找 pre index no 这个条目。

5.3.4 总结

通过上面的分析,我们可以总结一个通过 key 在 Index 文件中查找消息的流程,如下:

1.计算 key 的 hashcode;

2.根据 hashcode 在 Hash 槽中查找位置 s;

3.计算 Hash 槽在 Index 文件中位置 40+(s-1)*4;

4.读取这个槽的值,也就是Index条目序号 n;

5.计算该 index 条目在 Index 文件中的位置,公式:40 + 500万 * 4 + (n-1) * 20;

6.读取这个条目,比较 key 的 hashcode 和 index 条目中 hashcode是否相同,以及 key 传入的时间范围跟 Index 条目中的 timediff 是否匹配。如果条件不符合,则查找 pre index no 这个条目,找到后,从 CommitLog 中取出消息。

6.刷盘策略

Rocket MQ 采用灵活的刷盘策略。

6.1 异步刷盘

消息写入 CommitLog 时,并不会直接写入磁盘,而是先写入PageCache 缓存中,然后用后台线程异步把消息刷入磁盘。异步刷盘策略就是消息写入 PageCache  后立即返回成功,这样写入效率非常高。如果能容忍消息丢失,异步刷盘是最好的选择。

6.2 同步刷盘

即使同步刷盘,RocketMQ 也不是每条消息都要刷盘,线程将消息写入内存后,会请求刷盘线程进行刷盘,但是刷盘线程并不会只把当前请求的消息刷盘,而是会把待刷盘的消息一同刷盘。同步刷盘策略保证了消息的可靠性,但是也降低了吞吐量,增加了延迟。

 

 

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

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

相关文章

音质好的骨传导蓝牙耳机有哪些,十大公认音质好的骨传导耳机

​骨传导耳机是将声音转化为不同频率的机械振动,通过人的颅骨、骨迷路、内耳淋巴液、螺旋器、听觉中枢来传递声波。由于不需要像入耳式或入耳式耳机一样堵住耳朵来避免听力受损,也不会因为在听音乐的时候塞住耳朵而影响到旁边人的交流,所以骨…

LeetCode_Day5 | 有效的字母异位词、两个数组的交集、快乐数!

LeetCode_哈希表 242.有效的字母异位词1.题目描述2.题解 349.两个数组的交集1.题目描述2.题解 202.快乐数1.题目描述2.题解思路(官方题解啊!看了好几遍真难) 算法代码实现复杂度分析 242.有效的字母异位词 1.题目描述 给定两个字符串 s 和 t ,编写一个…

滑块验证码------啥?你居然还在手动滑动,你不来试试自动滑动吗

测试网站 测试网站:https://www.geetest.com/demo/slide-float.html 我的giteer:秦老大大 (qin-laoda) - Gitee.com里面有我写的代码 作者备注:由于我个人原因,文章写得感觉太长,后面我会把一个知识分成多部文章,这样可以简单明了的看到了 验证码的思路有两种:一种是通过se…

港科夜闻|香港科大取得重大科研突破,首度利用人工智能为阿尔兹海默症作早期风险预测...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科大取得重大科研突破,首度利用人工智能为阿尔兹海默症作早期风险预测。香港科大校长叶玉如教授及香港科大陈雷教授带领的研究团队,最近开发了一套人工智能模型,利用遗传信息&…

WTM框架运行报错0308010C:digital envelope routines::unsupported

WTM框架运行报错0308010C:digital envelope routines::unsupported 错误描述报错原因解决方式 错误描述 我所使用WTM搭建的程序是选择的.net5.0Vue前后端分离的方式,项目结构选择的是“各层分离的多个项目”;本人并非初次使用WTM平台框架搭建项目&#…

usb 电气特性

usb 电气特性 usb 的连线 在usb 3.0 之前都有插拔方向的 只有一边有接触点 标准usb连线使用4芯电缆: 5v电源线(VBus)、差分数据线负(D-)差分数据线正(D)及地线(GND)主要传输数据就是中间二个 D 和D- usb的数据传输…

基于 Wav2Lip-GFPGAN 深度学习模型的数字人Demo

写在前面 工作中遇到简单整理博文为 Wav2Lip-GFPGAN 环境搭建运行的 Demo理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是…

人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络(SNN)实现及应用

大家好,我是微学AI,今天给大家介绍一下人工智能(pytorch)搭建模型10-pytorch搭建脉冲神经网络(SNN)实现及应用,脉冲神经网络(SNN)是一种基于生物神经系统的神经网络模型,它通过模拟神…

ASP.NET Core Web API入门之二:Swagger详细使用

ASP.NET Core Web API入门之二:Swagger详细使用 一、引言二、Swagger的作用以及优点2.1 作用2.2 优点 三、API接口添加注释3.1 编辑项目文件3.2 修改 Startup.cs 文件的 ConfigureServices 方法3.3 修改浏览器的网页标题3.4 接口添加注释 四、运行后效果 一、引言 …

(六)矢量数据的空间分析——缓冲区分析

矢量数据的空间分析——缓冲区分析 目录 矢量数据的空间分析——缓冲区分析 1.基本概念1.1图解1.2缓冲距离1.2.1固定距离1.2.2由字段决定的距离 2.缓冲区的建立2.1操作步骤2.1.1点状要素建立缓冲区2.1.2面状要素建立缓冲区 缓冲区是一组或一类地图要素(点、线、面&a…

1.Tocmcat部署

文章目录 Tomcat部署介绍部署Tomcat安装jdk安装Tomcat添加tomcat系统服务 Tomcat部署虚拟主机tomcat多实例部署 Tomcat部署 Tomcat安装部署虚拟主机配置Tomcat优化 介绍 免费的、开放源代码的Web应用服务器Apache软件基金会(Apache Software Foundation)Jakarta项目中的- -个…

华为OD机试真题B卷 JavaScript 实现【5键键盘的输出】,附详细解题思路

一、题目描述 有一个特殊的5键键盘,上面有a,ctrl-c,ctrl-x,ctrl-v,ctrl-a五个键。 a键在屏幕上输出一个字母a;ctrl-c将当前选择的字母复制到剪贴板;ctrl-x将当前选择的字母复制到剪贴板&#…

【算法系列之哈希表I】leetcode15. 三数之和

242.有效的字母异位词 力扣题目链接 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 **注意:**若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。 输入: s "anagram", t "nag…

快来给你个人微信公众号认个证吧

欢迎关注「全栈工程师修炼指南」公众号 点击 👇 下方卡片 即可关注我哟! 作者安全运维学习答疑交流群:请关注公众号回复【学习交流群】 今天我一改往日,不谈技术只谈谈关于个人公众号认证流程,突然感觉自己有点不务正业了&#xf…

go语言学习——9

文章目录 goroutine概念goroutine调度模型 channelchannel介绍定义/声明channelchannel的关闭channel遍历channel其他细节 goroutine 前言:统计1~90000000数字中,哪些是素数? 使用循环,很慢使用并发或者并行的方式,将任…

【数据结构】二叉树(二)

目录 一、二叉树链式结构及实现 1、二叉树的结构 2、二叉树的遍历 2.1 前序遍历 2.2 中序遍历 2.3 后序遍历 2.4 层序遍历 3、二叉树链式结构的实现 3.1 创建一个节点 3.2 二叉树节点个数 3.3 二叉树叶子节点个数 3.4 二叉树的高度 3.5 二叉树第k层节点个数 3.6 二叉树查找值…

数据库管理-第八十二期 EMCC升级教程(20230607)

数据库管理 2023-06-07 第八十二期 EMCC升级教程1 升级EMCC1.1 升级概览1.2 拷贝相关文件1.3 升级OPatch1.4 升级OMSPatcher1.5 升级WLS1.6 升级OMS 2 升级Agent2.1 升级概览2.2 拷贝相关文件2.3 安装或升级AgentPatcher2.4 升级agent 3 升级Oracle数据库ASH包总结 第八十二期 …

什么时候适合加一层?

加一层能解决问题: 为什么加一层能解决问题? 什么时候适合加一层? 销售说不吵的, 道路检测说没有超标。 业主就是睡不着。 吃瓜群众说你为啥买那边的房子。 销售说开发商骗他,他也是受害者。 结果没问题&#xff0…

CSS 样式语言 选择器

CSS介绍 层叠样式表,是一种样式表语言,用来描述HTML和XML文档的呈现。随着HTML的发展,为了满足页面设计者的要求,HTML添加了很多显示功能,但是随着这些功能的增加,使得HTML越来越杂乱,HTML 页面…

「企业安全架构」EA874:安全需求,愿景、原则和流程

安全需求愿景 在开始任何安全架构工作之前,定义安全需求是很重要的。这些需求应该受到业务上下文和通用需求远景文档的影响。下面是一个图表,它显示安全需求是企业信息安全体系结构中业务上下文的一部分。 图1 安全需求远景(SRV)有…