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

news2024/11/19 3:43:30

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.coloradmin.cn/o/1629570.html

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

相关文章

如何在 Visual Studio 中通过 NuGet 添加包

在安装之前要先确定Nuget的包源是否有问题。 Visual Studio中怎样更改Nuget程序包源-CSDN博客 1.图形界面安装 打开您的项目,并在解决方案资源管理器中选择您的项目。单击“项目”菜单,然后选择“管理 NuGet 程序包”选项。在“NuGet 包管理器”窗口中…

Swift 中的 Range 运算符

在 Swift 中,Range 运算符是一种强大的工具,用于表示一系列连续的数值或字符。Range 可以用于循环、数组切片、条件语句等场景,为我们提供了方便的方法来处理数据集合。 闭区间运算符 a...b 闭区间运算符 a...b 用于创建一个从起始值到结束…

在虚拟环境中找到Qt Designer

Pyqt5中找到Qt Designer 安装Pyqt5和Qt Designer: pip install pyqt5-tools 假设Python的虚拟环境名为:d2l ,虚拟环境在d2l文件夹中 D:\Software\d2l\Lib\site-packages\qt5_applications\Qt\bin 双击Qt designer启动 Pyside2中找到Qt Designer d2l是虚拟环境…

NDK 基础(五)—— C++ 高级特性2

1、左值右值 在 C 中,左值(lvalue)和右值(rvalue)是用于描述表达式的术语,它们与赋值操作和内存中对象的生命周期有关。 **左值(lvalue)**是指可以出现在赋值操作符左侧的表达式&a…

【Vue3+Tres 三维开发】02-Debug

预览 介绍 Debug 这里主要是讲在三维中的调试,同以前threejs中使用的lil-gui类似,TRESJS也提供了一套可视化参数调试的插件。使用方式和之前的组件相似。 使用 通过导入useTweakPane 即可 import { useTweakPane, OrbitControls } from "@tresjs/cientos"const {…

PotatoPie 4.0 实验教程(21) —— FPGA实现摄像头图像二值化(RGB2Gray2Bin)

PotatoPie 4.0开发板教程目录(2024/04/21) 为什么要进行图像的二值化? 当我们处理图像时,常常需要将其转换为二值图像。这是因为在很多应用中,我们只对图像中的某些特定部分感兴趣,而不需要考虑所有像素的…

机器视觉系统-工业光源什么是同轴光

光路描述:反射光线与镜头平行,称为同轴光。 效果分析:光线经过平面反射后,与光轴平行地进入镜头。此时被测物相当于一面镜子,图像体现的是光源的信息,当“镜子“出现凹凸不平时,将格外地明显。 …

Win32 API 光标隐藏定位和键盘读取等常用函数

Win32 API 光标隐藏定位和键盘读取等常用函数 一、Win32 API二、控制台程序指令modetitlepausecls 三、控制台屏幕上坐标的结构体COORD四、句柄获取函数GetStdHandle五、控制台光标操作1.控制台光标信息结构体CONSOLE_CURSOR_INFO2.得到光标信息函数GetConsoleCursorInfo3. 设置…

会跳舞的网站引导页HTML源码

源码介绍 这套引导页源码非常好看,网址也不会不停的动起来给人一种视觉感很强烈 简单修改一下里面的地址就行看,非常简单! 效果预览 源码下载 会跳舞的网站引导页HTML源码

排序FollowUp

FollowUp 插入排序 直接插入排序 时间复杂度:最坏情况下:0(n^2) 最好情况下:0(n)当数据越有序 排序越快 适用于: 待排序序列 已经基本上趋于有序了! 空间复杂度:0(1) 稳定性:稳定的 public static void insertSort(int[] array){for (int i 1; i < array.length; i) {int…

64位整数高低位的数据获取与赋值操作探讨

参考本篇->LOWORD和HIWORD函数_hidword-CSDN博客 一&#xff0c;如何获取一个64位整数的高32位和低32位 原理其实很简单&#xff1a; 解释一些概念 ①十六进制和二进制直接挂钩 一个十六位的十六进制数【0XAABBCCDD12345678】转为二进制的过程是把其中的每个数转为对应的二…

构建中小型企业网络-单臂路由

1.给IP地址配置好对应的IP和网关 2.配置交换机 3.路由配置 在交换机ge0/0/1中配置端口为trunk是可以允许多个vlan通过的&#xff0c;但路由器是不能够配置vlan&#xff0c;而交换机和路由器间连接的只有一根线&#xff0c;一个端口又只能配置一个ip地址&#xff0c;只有一个ip地…

人脸识别概念解析

目录 1. 概述 2. 人脸检测 3. 人脸跟踪 4. 质量评价 5. 活体检测 6. 特征提取 7. 人脸验证 8. 人脸辨识 1. 概述 人脸识别在我们的生活中随处可见&#xff0c;例如在大楼门禁系统中&#xff0c;它取代了传统的门禁卡或密码&#xff0c;提高了进出的便捷性和安全性。在商…

如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器

提供一份资料文档以一个具体的工程案例来讲解&#xff0c;如何通过4G DTU实现现场仪表的分布式采集并发布到MQTT服务器。采用的数据采集模块是有人物联的边缘采集4G DTU&#xff0c;采集多个多功能电表和远传水表的数据&#xff0c;通过MQTT通讯的型式传送给MQTT服务器&#xf…

Elsevier(爱思唯尔)期刊—Latex模板下载、使用、投稿过程

目录 一、Elsevier期刊-Latex模板下载 1. Elsevier 通用latex模板下载&#xff1a;【elsarticle.zip】 2. Elsevier 复杂版式latex模板下载&#xff1a;【els-cas-templates.zip】&#xff0c;有单栏和双栏版本 二、Elsevier期刊-Latex模板使用 1. 通用模板【elsarticle.zi…

【源码】IM即时通讯源码/H5聊天软件/视频通话+语音通话/带文字部署教程

【源码介绍】 IM即时通讯源码/H5聊天软件/视频通话语音通话/带文字部署教程 【源码说明】 测试环境&#xff1a;Linux系统CentOS7.6、宝塔、PHP7.2、MySQL5.6&#xff0c;根目录public&#xff0c;伪静态laravel5&#xff0c;根据情况开启SSL 登录后台看到很熟悉。。原来是…

如何在 Ubuntu 12.04 上使用 Apache 配置 WebDAV 访问

简介 WebDAV 是内置在 HTTP 中的分布式网络编辑实现&#xff0c;允许您轻松共享文件并与他人协作。 我们可以在 Web 服务器中安装此扩展&#xff0c;以允许通过 Web 浏览器远程读写访问本地文件。在本指南中&#xff0c;我们将在带有 Apache Web 服务器的 Ubuntu 12.04 VPS 上…

Mysql--创建数据库

一、创建一个数据库 “db_classes” mysql> create database db_classes; mysql> show databases; -------------------- | Database | -------------------- | db_classes | | information_schema | | mysql | | performance_schema | |…

PeLK: 大卷积核强势回归,高达101 × 101,提出了外围卷积

paper&#xff1a;https://arxiv.org/pdf/2403.07589 code&#xff1a;暂无 目录 0. 摘要 1. 引言 2. 相关工作 2.1. Large Kernel Convolutional Networks 2.2. Peripheral Vision for Machine Learning 3. 密集卷积优于条纹卷积 4. 参数高效的大核卷积神经网络 4.1. …

【Vue】如何使用Webpack实现打包操作

一、Webpack介绍 Webpack最主要的作用就是打包操作&#xff0c;由两个核心部分构成分别是“出口”与“入口”。wbepack是现在比较热门的打包工具了&#xff0c;它可以将许多松散耦合的模块按照依赖和规则打包成符合生产环境部署的前端资源。说的直白一点&#xff0c;通过webpac…