RocketMQ快速入门:namesrv、broker、dashboard的作用及消息发送、消费流程(三)

0. 引言

接触rocketmq之后,大家首当其冲的就会发现需要安装3个组件:namesrv, broker, dashboard,其中dashboard也叫console,为选装。而这几个组件之前的关系是什么呢,消息发送和接收的过程是如何传递的呢,这是我们要详细了解的。

1. rocketmq组件架构

rocketmq实际上一共由4个部分组成:namesrv, broker, 生产者, 消费者

而dashboard则是作为单独的管理端存在,目前是为了方便管理、查看队列、topic、集群的情况。所以我们重点放在namesrv, broker的理解上。

image-20240308170213377

1.1 namesrv的作用

namesrv 实际上的一个核心作用就是充当一个注册中心,相当于zookeeper的作用,但是比zookeeper更加轻量,负责broker、路由信息的管理。

namesrv可以部署集群模式,但每个节点都相互独立,并不进行通信,所以也就意味着namesrv每个节点都会存储全量的路由数据,而broker也会向每个namesrv发送注册信息。

broker会每30s向namesrv发送一次心跳包,用于注册和更新自己的路由信息,同时namesrv会与broker保持长连接,每10s发送一次心跳检测,检测broker是否还存活,如果超120s没有响应,则会将该节点剔除。

image-20240308174803339

1.2 broker的作用

broker实际上才是rocketmq的业务处理者,主要负责消息的存储、传递、查询、高可用等。
在这里插入图片描述

broker中主要包含以下几个核心模块:

  • Remoting Moudle 远程控制模块:整个 Broker 的实体,负责处理来自客户端的请求

  • Client Manager 客户端管理器:负责管理客户端(生产者、消费者)和维护消费者的主题订阅信息

  • Store Service:提供 API 接口,用以处理消息存储到物理硬盘和查询功能

  • HA Service:高可用服务,提供 Master Broker 和 Slave Broker 之间的数据同步功能

  • Index Service:根据特定的 Message Key 对投递到 Broker 的消息进行索引服务,以提供消息的快速查询

——该段内容引用于:rocektmq核心知识

2. 消息发送流程

2.1 三种发送模式

RocketMQ支持3种消息发送模式:同步 (sync)、异步(async)、单向(oneway)

  • 同步发送:

指生产者发送消息后,需要等到broker收到消息后才会返回确认结果给生产者的模式。这种模式中生产者会等到broker返回确认结果后才认定发送结束,如果超时未收到结果则认为发送失败。
所以该种模式,更加适合对可靠性要求更高的场景,且顺序消费就需要通过同步发送实现

  • 异步发送:

指生产者发送消息后,不会阻塞等等待broker的确认结果返回了,而是直接返回一个future对象给调用方,生产者会开启一个后台线程异步等待确认结果,最后通过回调函数处理发送结果
这种模式比较明显的好处就是不用阻塞等待,适合对响应时间有要求的场景,同时消息发送的可靠性就降低了,可能会发送失败,这就需要在回调函数中做好补偿操作

  • 单向发送:

单向发送更加简单粗暴,即发送完成后就不管后续的结果了,无论发送成功和失败,只要发出则工作就结束。
因此其发送速度是最快速的,同时也是最不可靠的,适合于边缘日志记录、广播通知等场景

其他消息发送拓展
当然rocketmq也支持发送顺序消息、事务消息、延迟消息、批量发送消息等,这些我们将在后续的文章里介绍

2.2 消息发送流程

消息发送的流程主要分成3步:

1、生产者从本地缓存获取指定topic的路由信息(ip、端口等信息)

2、如果本地缓存没有的话,再访问namesrv,更新路由信息到本地缓存,并返回给生产者

3、生产者根据topic的路由信息发送到指定brocker的对应topic,则完成了消息发送

后续消费者再从topic消费消息即可

在这里插入图片描述
所以这里再次强调,namesrv本身是不参与消息发送的实际工作的,它的作用就是管理broker、topic的路由信息,为消息发送者发送时提供目标地址

3. 消息消费流程

3.1 两种消费模式

rocketmq 支持两种消费模式:集群消费模式和广播消费模式

  • 集群模式:

集群消费模式指的是一条消息仅被同一个消费者组(Consumer Group)中的一个消费者消费(在使用消费者时需要指定一个消费者组名,一个消费者组可以订阅多个Topic),同时所有的消息会被平均分配给每个消费者均匀消费,只是每一次一条消息只会被一个消费者消费。就像我们部署的集群节点,一次请求在负载均衡的作用下,只会交给其中一个节点处理。
该模式适用于对可用性要求较高,则可部署多个消费者,同时要求消息的唯一性,则只能被一个消费者消费的场景

  • 广播模式:

广播模式指一条消息能被同一消费者组下的所有消费者消费,就像广播一些,只要播出,所有人都能听到。
该模式适用于订阅服务等需要全体通知的场景。

3.2 两种消费形式

rocketmq 还提供了两种消息形式:pull 拉取和 push推送

  • pull 拉取形式:

在pull模式中,消费者主动向Broker拉取消息,主动控制什么时候拉取以及每次拉取的数量。
该模式更适用于需要消费者主动控制的场景

  • push 推送形式:

在push模式中,broker主动将消息推送给消费者,消费者不需要再去主动关注消息获取。有消息发送过来后,broker就会将消息推送给消费者。
实际上,rocketmq中并不直接支持push模式,而是通过消费者实时监听topic的形式来实现的。所以实际上也是pull的形式,只不过是通过监听实现不停的pull以此模拟push效果。
该形式更加适合对消费实时性要求较高的场景

3.3 消息消费流程

我们上面说明过rocketmq的push模式实际上也是pull封装实现的,所以其消费流程,我们重点理解pull形式即可。

1、默认情况下,消费者会和一个namesrv保持长连接,如果该namesrv宕机,则自动连接到下一个namesrv,每30s查询topic配置信息并保存到本地缓存,当消费消息时,就会通过本地缓存中的路由信息连接broker。同时消费者每隔30秒会向所有broker发送心跳包,broker以此维护消费者的路由表,该表将作为后续broker做消费者端的负载均衡的依据。

2、消费者启动或者数量发生变化时,会触发消费者端的负载均衡,会根据预设的负载均衡算法来选择队列,然后向broker注册队列绑定,一个topic下会有多个队列,而broker会通过加锁操作来保证一个队列只能被一个消费者绑定。因为广播模式所有的消费者都会收到消息,所以广播模式下没有负载均衡可言,这里的负载均衡主要针对集群模式。

这里需要注意的是:rocketmq的负载均衡实际是通过生产者的负载均衡和消费者的负载均衡共同实现的,生产者负载均衡选择将消息发送到topic下的哪个队列,消费者的负载均衡决定每个消费者绑定消费哪个队列。

3、进行消息消费时,消费者先从本地缓存获取获取topic路由信息,如果本地缓存没有则从namesrv更新一份

4、从本地缓存获取消费进度(即偏移量 offset),本地缓存没有则从broker更新进度到本地缓存

5、根据消费进度拉取最新的消息

6、消费者处理拉取到的消息,处理完成后,向broker发送ACK确认消息已消费

7、消费成功后,消费者会更新自己在broker上的消费进度,以方便下一次消费
在这里插入图片描述

4. dashboard的作用

dashboard 是 RocketMQ 的一款开源控制台管理工具,原为rocketmq仓库下的console模块,后独立出来并重命名为dashboard,它提供了一个可视化的界面来管理和监控 RocketMQ 集群。通过 Dashboard,我们可以更方便地查看集群状态、topic信息、生产者和消费者的运行情况,以及进行消息的查询和操作

总而言之,其是用于rocketmq的监控管理可视化平台,在实际生产中极为重要,可以很大程度简化我们的排查、运维工作。

在这里插入图片描述

5. 总结

到这里我们就了解了rocektmq中的4个组成:消费者、namesrv、broker、生产者以及他们的作用,以及核心的消息生产、发送流程。下一节,我们再针对rocektmq中的group、topic、tag、queue等概念进行讲解,并梳理清楚他们之间的关系,让大家从基础上理解得更加清晰。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

应用实战 | 别踩白块小游戏,邀请大家来PK挑战~

“踩白块会输”是一个简单的微信小程序游戏,灵感来自当年火热的别踩白块游戏,程序内分成三个模块:手残模式、经典模式和极速模式,分别对应由易到难的三种玩法,可以查看游戏排名。动画效果采用JS实现,小程序…

Spark-机器学习(6)分类学习之支持向量机

在之前的文章中,我们学习了分类学习之朴素贝叶斯算法,并带来简单案例,学习用法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢…

基于YOLOV8+Pyqt5无人机航拍太阳能电池板检测系统

1.YOLOv8的基本原理 YOLOv8是一种前沿的目标检测技术,它基于先前YOLO版本在目标检测任务上的成功,进一步提升了性能和灵活性,在精度和速度方面都具有尖端性能。在之前YOLO 版本的基础上,YOLOv8 引入了新的功能和优化,…

SpringBoot 常用注解总结超详细(面试)

目录 一、组件相关🎁 Controller Service Repository Component 二、依赖注入相关🍉 Autowired Resource 根据类型注入(By Type) 根据名称注入(By Name) 区别 Qualifier Resource 和 Qualifie…

C语言浮点型数据在内存中的存储及取出等的介绍

文章目录 前言一、浮点型在内存中的存储二、浮点数存储规则三、浮点数在内存中的存储(32位)float类型四、浮点数在内存中的存储(64位)double类型五、指数E从内存中取出分成三种情况1. E不全为0或不全为12. E全为03. E全为1 六、有…

设计模式之工厂模式FactoryPattern(二)

一、简单工厂 package com.xu.demo.factoryPattern;/*** 简单工厂模式类*/ public class SimpleFactoryPattern {public static Phone create(String name) {//根据输入对象名称判断返回相匹配的对象if("IPhone".equals(name)) {//返回对象return new IPhone();}else…

Java算法--队列

队列 队列介绍 队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 数组模拟队列思路 队列本身是有序列表,若使用数组的结构来存储队列的数据,则…

自动驾驶新书“五一”节马上上市了

我和杨子江教授合写的《自动驾驶系统开发》终于在清华大学出版社三校稿之后即将在五一节后出版。 清华大学汽车学院的李克强教授和工程院院士撰写了序言。 该书得到了唯一华人图灵奖获得者姚期智院士、西安交大管晓宏教授和科学院院士以及杨强教授和院士等的推荐,…

git变更远端仓库名之后如何修改本地仓库配置的另一种方法?(删remote指针、添加、绑定master)

背景 如果某个远端的仓库地址变化后,本地仓库可以修改对应的remote。 之前谈过几种方法,比如重新设置一个新的remote的指针,绑定到新地址。然后删除origin,然后把新指针mv到origin。比如直接seturl修改(git remote se…

基于HTML+CSS+JavaScript的表白网页

基于HTMLCSSJavaScript的表白网页 前言效果截图(为GIF格式)部分代码领取源码下期更新预报 前言 大部分人都有喜欢的人,学会这个表白代码,下次表白你肯定会成功。 效果截图(为GIF格式) 部分代码 index.htm…

使用 Python 和 DirectShow 从相机捕获图像

在 Python 中使用 OpenCV 是视觉应用程序原型的一个非常好的解决方案,它允许您快速起草和测试算法。处理从文件中读取的图像非常容易,如果要处理从相机捕获的图像,则不那么容易。OpenCV 提供了一些基本方法来访问链接到 PC 的相机(通过对象),但大多数时候,即使对于简单的…

在no branch上commit后,再切换到其他分支,找不到no branch分支的修改怎么办?

解决办法 通过git reflog我们可以查看历史提交记录,这里的第二条提交(fbd3ea8)就是我在no branch上的提交。 再通过git checkout -b backup fbd3ea8,恢复到上次提交的状态,并且为其创建个分支backup,此时…

B+tree - B+树深度解析+C语言实现+opencv绘图助解

Btree - B树深度解析C语言实现opencv绘图助解 1. 概述2. Btree介绍3. Btree算法实现3.1 插入分裂 3.2 删除向右借位(左旋)向左借位(右旋)合并 3.3 查询和遍历3.3.1 查询3.3.2 遍历 3.4 优化优化1(匀key)优化2(升级key)优化3(拓展兄…

池化整合多元数据库,zData X 一体机助力证券公司IT基础架构革新

引言 近期,云和恩墨 zData X 多元数据库一体机(以下简称 zData X)在某证券公司的OA、短信和CRM业务系统中成功上线,标志着其IT基础架构完成从集中式存储向池化高性能分布式存储的转变。zData X 成功整合了该证券公司使用的达梦、O…

SEO之链接原理(三)

初创企业需要建站的朋友看这篇文章,谢谢支持: 我给不会敲代码又想搭建网站的人建议 (接上一篇) 4、 Google PR PR是 PageRank 的缩写。Google PR理论是所有基于链接的搜索引擎理论中最有名的。 PR是Google创始人之一拉里佩奇发明…

二维数组打印菱形(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>int main() {//初始化变量值&#xff1b;char arr[5][5] { { , , *, , }, { , *, *, *, },{*, *, *, *, *}, { , *, *, *, …

【基于BP神经网络的多输入分类预测】

文章目录 前言环境准备导入数据划分训练集和测试集数据归一化建立模型设置训练参数训练网络仿真测试数据反归一化和排序性能评价结果可视化混淆矩阵 前言 在数据科学和机器学习领域&#xff0c;对复杂数据集进行高精度的分类预测是一个常见且关键的任务。本文通过MATLAB代码示例…

python3GUI--本地简易音乐播放器By:PyQt5(附下载地址)

文章目录 二&#xff0e;展示1.启动2.添加音乐&播放3.软件风格 三&#xff0e;软件整体功能-览四&#xff0e;实现原理1.界面设计2.音频播放3.打包 五&#xff0e;总结 博客二连发&#xff0c;继续为大家带来我使用PyQt5开发的软件&#xff0c;本次为大家分享我写的一款本地…

MySQL数据库常见SQL语句宝典

一 、常用操作数据库的命令 1.查看所有的数据库 : show databases;2.创建一个数据库 : create database if not exists 数据库名;3.删除一个数据库 : drop database if exists 数据库名;4.选择一张表 (注意在建表之前必须要选择数据库) : use 表名;* --tab 键的上面&#x…

如何我现在是本地的文件路径不是http,用html如何打开

--别给我BB 如何我现在是本地的文件架路径不是http&#xff0c;用html如何打开? 答&#xff1a; 如果你想在HTML中打开本地文件路径的视频&#xff0c;可以使用file://协议。假设你的视频文件在本地的路径为/path/to/your/video.mp4&#xff0c;那么你可以将src属性设置为file…
最新文章