4.3 RocketMQ (三) 基本原理

RocketMQ(三)基本原理 文章目录Topic 基本原理在Rocketmq集群中新建 Topic1perm 参数的含义Topic 收发消息原理生产者的负载均衡消费者的负载均衡AllocateMessageQueueAveragely 平均分配AllocateMessageQueueAveragelyByCircle 环形分配AllocateMessageQueueConsistentHash 一致性哈希NameServer 基本原理基本认识Broker、Producer、Consumer 与NameServer的通信 Topic 基 阅读详情


1.Topic 基本原理

1.1 在Rocketmq集群中新建 Topic1

在管理界面中新建主题Topic1,为了方便观察测试效果,这里把写队列和读队列的数量都设置成3。

在这里插入图片描述

这样,在 broker-a 和 broker-b 上都创建了 Topic1 主题,并各创建了3写3读队列,共6写6读,如下图所示:

topic1

你也可以修改Topic1分别配置 broker-a 和 borker-b 上的队列数量。

1.2 perm 参数的含义

perm 参数是设置队列的读写权限,下面表格列出了可配置的值及其含义:

取值含义
6同时开启读写
4禁写
2禁读

1.3 Topic 收发消息原理

topic

生产者将消息发送到 Topic1 的其中一个写队列,消费者从对应的一个读队列接收消息。

1.4 生产者的负载均衡

producer

生产者以轮询的方式向所有写队列发送消息,这些队列可能会分布在多个broker实例上。并且读写队列是一一对应的,写队列1只会发消息给读队列1,而不是给其他读队列;

1.5 消费者的负载均衡

一个 group 中的多个消费者,可以以负载均衡的方式来接收消息。

读取队列被均匀分配给这些消费者,它们从指定的队列来接收消息。队列的分配可以采用不同的策略,这里简略介绍以下三种策略:

2. AllocateMessageQueueAveragely 策略

2.1 AllocateMessageQueueAveragely 平均分配

平均分配是Topic的默认策略,在俩台服务器中,各有三个写队列,3个读队列,共6个读写队列,平均分配策略在消息发送到Topic时,会轮询给6个读写队列发送消息,Topic接收消息后,也会已轮询的方式平均发送给3个消费者;

但是如果消息共发送了7条,共6个读写队列,那么Topic1的队列1会接收到2条消息,而其他队列都只接收到1条消息,并且消费者1接收到了3条消息,其他消费者只接收了2条消息,所以其平均分配也只是相对来说;

但是其也有一个弊端,如果broker-b宕机,那么相对应的消息也全都会丢失,并不会转发到broker-a去进行转发;

topic

2.2 AllocateMessageQueueAveragelyByCircle 环形分配

如果使用环形分配,需要调用consumer对象,在消费者的代码中需要设置分配策略,代码如下:

consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueAveragelyByCircle());

这种分配策略的逻辑很简单,其通过下标进行分配;所有0号队列分给0号消费者,所有1号队列分给1号消费者,以此类推。

此时当有服务器宕机的话,就不会存在消费者收不到消息的情况,还会有其他服务器给相应的消费者发送消息;但是如果一个Topic只有3个队列时,如果有4个消费者,那么第4个消费者并不会接收到任何消息,三个队列都有自己固定的消费者,此时需要增加一个队列,才可以让第4个消费者接收到消息;

topic

2.3 AllocateMessageQueueConsistentHash 一致性哈希

如果使用一致性哈希算法进行分配,需要调用consumer对象,在消费者的代码中需要设置分配策略,代码如下:

consumer.setAllocateMessageQueueStrategy(new AllocateMessageQueueConsistentHash());

这种算法依靠一致性哈希算法,看当前消费者可以落到哪个虚拟节点,该虚拟节点对应哪个队列。

2.4 问题

思考一下,如果写队列比读队列多会怎样?反之会怎样?

3.NameServer 基本原理

rocketmq

NameServer 是 rocketmq 自己开发的一个轻型注册中心,他的作用相当于是 zk、eureka等。

rocketmq 为什么不使用 zk 呢?实际上 rocketmq 的早期版本使用的就是 zookeeper`。

而 rocketmq 的架构设计决定了只需要一个轻量级的元数据服务器就足够了。杀鸡焉用牛刀?小区里,搞个货架就行了,建个仓库,又占地方,维护成本又高。

甚至,NameServer 都不需要有一个集群的管理者。以至于,NameServer 看起来都不像一个集群。事实上,NameServer 本质上来看,也不是一个集群。因为它的各个节点是独立的,不相关的。每个 NameServer 都是独立和 Producer、Consumer打交道。

3.1 基本认识

  1. NameServer主要用于存储Topic,Broker关系信息,功能简单,稳定性高。
  2. 各个NameServer节点之间不相关,不需要通信,单台宕机不影响其它节点。
  3. NameServer集群整体宕机不影响已建立关系的Concumer,Producer,Broker。

3.2 Broker、Producer、Consumer 与NameServer的通信

  1. 每个Borker和所有NameServer保持长连接,心跳间隔为30秒。每次心跳时还会携带当前的Topic信息。当某个Broker两分钟之内没有心跳,则认为该Broker下线,并调整内存中与该Broker相关的Topic信息。
  2. Consumer 从 NameServer 获得 Topic 的路由信息,与对应的 Broker 建立长连接。间隔30秒发送心跳至Broker。Broker检查若发现某 Consumer 两分钟内无心跳则认为该Consumer下线,并通知该Consumer所有的消费者集群中的其他实例,触发该消费者集群重新负载均衡。
  3. Producer 与消费者一样,也是从 NameServer 获得 Topic 的路由信息,与对应的 Broker 建立长连接,30秒发送一次心跳。Broker 也会认为两分钟内没有心跳的 Producer 下线。
RocketMQ (三) 基本原理 本文介绍了RocketMQ中Topic的基本原理及消息收发机制。主要内容包括:新建Topic时的队列配置、perm参数含义(6表示读写、4禁写、2禁读)、生产者采用轮询方式向写队列发送消息、消费者负载均衡策略(平均分配、环形分配和一致性哈希分配)。此外还简要提及了NameServer的基础功能,包括Broker注册及与生产者/消费者的通信机制。文章通过示意图展示了队列分配的具体过程,帮助理解RocketMQ的核心消息处理机制。 阅读详情

相关推荐

RocketMQ4.3.0集群搭建和部署rocketMq监控平台

集群部署(采用2个master,2个slave异步复制的集群结构)   RocketMQ具有以下特点: 1)是一个队列模型的消息中间件,具有高性能、高可靠、高实时、分布式特点。 2)Producer、Consumer、队列都可以分布式。 3)Producer向一些队列轮流发送消息,队列集合称为Topic,Consumer如果做广播消费,则一个consumer实例消费这个Topic对应...

飞少fly的博客 1万+

RocketMq的perm属性

RocketMq的perm属性

荣山的博客 4022

RocketMQ 5.3.1 集成 Spring Boot 3.4.3 就这么简单

RocketMQ 是一个分布式消息中间件,支持发布/订阅模型,具有高吞吐量、高可用性和事务消息等特性。它广泛应用于日志处理、订单系统和异步任务等场景。Spring Boot 3.4.3 集成 RocketMQ 5.3.1 的过程异常简单,仅需少量配置即可实现消息的生产和消费。本文从环境搭建到代码实现,覆盖了核心步骤。

lssffy的博客 1379

rocketmq perm含义

配置 Topic 读写权限 名称: Perm 类型: Integer 是否必须: 是 作用: 设置该 Topic 的读写模式。 取值说明如下: 6:同时支持读写 4:禁写 2:禁读 一般情况设置为: 6. ...

大叶子不小的博客 810

rocketmq使用mqtt协议

rocketmq从4.9.3开始,可以兼容mqtt协议,需要安装编译一个rocketmq-mqtt工程,参考:https://rocketmq.apache.org/zh/docs/4.x/mqtt/02RocketMQMQTTQuickStart/需要安装rocketmq4.9.3以上的版本 安装过程略broker.conf配置文件中添加参数,开启多队列分发特性 二、打包rocketmq-mqtt 安装maven配置环境变量 过程略 下载并打包 三、配置rocketmq-mqtt 下面例子中 ROCKET

文若书生的专栏 8286

基于Docker安装RocketMQ4.3.2

目录 拉取镜像 创建nameserver容器 创建broker容器 启动容器 测试消息是否可以发送成功 拉取镜像 我们拉取的不是官方提供的rocketmq,而是一个哥们自己整个的rocketmq版本。之所以不选择官方提供的最主要原因是,官方提供的版本有很多配置地方比较麻烦,这哥们整合的更好一些。 docker pull foxiswho/rocketmq:serv...

我能在河边钓一整天的鱼 981

RocketMQ PERM含义 PERM=7、6、4、2

RocketMQ权限控制 PERM_INHERIT:Topic继承,value:1 PermName.PERM_READ:Topic读,value:4 PermName.PERM_WRITE:Topic写,value:2 perm=7 #可继承、读、写 perm=4 #可读 perm=2 #可写 注解:RocketMQ的Topic自动新建是通过继承TBW102实现的,如果把TBW102的perm改为6,将不会自动创建Topic ...

浮生若梦 2703

IAR链接器配置文件(.icf)实战指南:从内存映射到代码布局

本文深入解析了IAR链接器配置文件(.icf)的核心作用与实战配置方法。作为嵌入式开发的“内存地图”,.icf文件精确控制代码与数据在Flash和RAM中的布局。文章从定义存储空间、划分区域、预留栈堆,到精确放置中断向量表、代码段及初始化控制,提供了完整的配置指南与避坑技巧,帮助开发者优化内存使用,解决链接错误,是掌握嵌入式系统底层内存管理的关键。

fun88的博客 909

RocketMQ三:rocketmq进阶和深入理解

每个ConsumeQueue文件固定由30万个固定大小20byte的数据块组成,数据块的内容包括:msgPhyOffset(8byte,消息在文件中的起始位置)+msgSize(4byte,消息在文件中占用的长度)+msgTagCode(8byte,消息的tag的Hash值)。通常,一条消息进入了死信队列,意味着消息在消费处理的过程中出现了比较严重的错误,并且无法自行恢复。​ 首先对于广播模式的消息, 是不存在消息重试的机制的,即消息消费失败后,不会再重新进行发送,而只是继续消费新的消息。

admin522043032的博客 1457

告别昂贵硬件!用Unity3D 2023 + ROS2 Humble搭建你的第一个SLAM仿真实验室(保姆级教程)

本文提供了一份详细的教程,介绍如何使用Unity3D 2023和ROS2 Humble搭建SLAM仿真实验室,无需昂贵硬件即可实现虚拟传感器模拟和算法测试。通过Docker容器配置、ROS2安装优化及Unity插件集成,开发者可以快速构建高精度的仿真环境,适用于自主导航、多传感器标定等场景。

weixin_42526353的博客 429

LabVIEW+数据库应用系列保姆级教程,第一篇数据库连接

目录LabVIEW连接数据库的方法连接MySQL连接Oracle,SQL Server,Access等 LabVIEW连接数据库的方法 1、创建udl(Universal Data Link)是通用数据连接文件。界面操作,简单快捷。 2、编写连接字符串。需要熟悉连接字符串的结构,容易出错。 3、其他… 本教程教你使用第1种方法,也是最简单、最常用的方法。 连接MySQL 1、在MySQL Installer内安装MySQL Connector/ODBC,建议安装32位(X86),如下图: 2、创建ODBC

wwplh5520370的博客 1万+

Windows 10 本地部署 RocketMQ 5.3.3 全流程指南:RocketMQ 下载、本地部署、RocketMQ Dashboard 2.0.0

本文详细介绍了在Windows 10环境下部署RocketMQ 5.3.3的完整过程。系统配置为8G内存+JDK21环境。下载并使用RocketMQ二进制发布包部署。重点说明了环境变量ROCKETMQ_HOME的设置方法,以及如何启动NameServer服务,如何启动Broker,如何启动控制台RocketMQ Dashboard 2.0.0。

宋冠巡的博客 3231

PredFormer实战:用Transformer搞定交通流量预测(附TaxiBJ数据集代码)

本文详细介绍了如何利用PredFormer这一基于Transformer的先进模型进行交通流量预测,特别针对TaxiBJ数据集提供了完整的实战代码和优化策略。PredFormer通过门控Transformer块(GTB)的创新设计,在时空预测任务中展现出显著优势,相比传统方法将MSE降低33.1%,推理速度提升4.4倍。文章还涵盖了模型轻量化、部署优化等实用技巧,为智慧城市建设中的交通预测提供了高效解决方案。

weixin_29194817的博客 439

redis5,kafka3.4,rocketmq5部署

redis5,kafka3.4,rocketmq5在centos环境部署

qsfhngy的博客 1217

PCL 建筑物点云立面和平面分割提取【2025最新版】

在建筑物点云中,立面点和平面点的法向量存在明显的差异,根据法向量在Z方向的分量设置相应得阈值即可实现立面点与平面点的分割。

点云侠的博客 1955

【keil5和STC-ISP】保姆级下载安装教程

点击下载中的产品下载。然后就会看到如下界面:可以看到,提供了针对不同芯片架构的四套独立开发工具。:你使用的51单片机,其核心就是。C51套件里的编译器是专门为这个架构优化的。:如果安装了MDK-Arm,你在创建新项目时将像“AT89C51”这样的51系列芯片型号,无法进行开发。进入如下界面:双击下载 → 双击运行安装 → 同意协议并下一步 → 使用默认安装路径 → 完成安装。

深耕CV 1607

《RocketMq》三、NameServer

RocketMQ-nameSrv用于管理所有broker的信息,以便于Producer和Consumer能够获取到正确的Broker信息,进行业务处理;可以看到NameSrv的主要管理内容如下:1. 接收Broker的注册,注销请求;2. Producer获取topic下的所有BrokerQueue,put消息3. Consumer获取topic下所有的BrokerQueue,get消息所以可以看...

zxx的专栏 8839

汽车零部件产线实战:C#上位机+YOLO实现螺栓装配到位视觉检测

本项目基于C#上位机+YOLOv8实现汽车零部件产线螺栓装配到位视觉检测,全程贴合产线实际场景,从硬件选型、安装调试,到模型训练、上位机开发,再到项目联调、优化扩展,均提供手把手实操指导,代码可直接复制使用,规避了工业视觉产线检测的高频踩坑点。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1321

RocketMQ4.3.0之Windows下部署

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34372728的博客 427

封装POD与PinMap文件总结学习-20250516

芯片封装外形图(POD)和PinMap是芯片设计和制造中的关键文档。POD详细描述了芯片的物理尺寸、引脚布局和封装类型,而PinMap则提供了芯片封装上各个引脚的位置、名称和功能的详细信息。这些文档在芯片设计、制造和应用过程中起到“地图”的作用,帮助设计人员理解芯片的物理和电气特性。在PCB设计中,POD用于确定socket的footprint和pogo的选型,而PinMap则用于器件的合理布局和布线。这些信息对于确保芯片的正确安装和功能至关重要。

歌颂苦难的行为是无耻的; 2343

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

人人都懂的RocketMQ基本原理

RockerMQ基本原理

不是秃头的程序员小李 3747

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Mac搭建单机版RocketMQ-4.9.3

文章目录一、背景二、RocketMQ1、准备工作2、方式一:项目源码启动(1)启动nameServer(2)启动broker(3)Producer发布消息(4)Consumer消费消息(5)Dashboard查看3、方式二:命令启动 一、背景 版本说明: JDK:1.8 RocketMQ: 4.9.3 Dashboard: 二、RocketMQ 1、准备工作 下载地址: https://www.apache.org/dyn/closer.cgi?path=rocketmq/4.9.3/rocketmq-al

技术交流 1330

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: 4.1 RocketMQ (一) 安装
下一篇: 4.2 RocketMQ (二) 双主双从同步复制集群方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值