一文读懂 RocketMQ:从概念到架构与应用原理概述

news2025/4/26 8:56:32

文章目录

  • 概述
  • 架构说明
    • 核心组件
    • 核心概念
  • namesvr
  • producer
    • 默认实现
    • producer启动
    • 消息发送
  • broker-mq核心
    • 基本模型
    • 集群模型
    • 内部模型
    • 存储机制
    • 高可用
  • consumer
    • push类型
    • push流程
    • pull类型

概述

随着分布式技术在业内的快速应用,mq(消息队列)做为不可或缺的重要组件发挥着重要作用:削峰,异步,解耦。rocketmq做为热门产品,本文将对该产品实现原理进行一些分析,供大家参考。

架构说明

核心组件

在这里插入图片描述

  • 组成: name servers, brokers, producers, consumers
  • 特性:支持水平扩展,没有单一的故障点

核心概念

在这里插入图片描述

  • topic(主题):简单的理解为消息的类型,相同类型的消息使用相同的topic。例:某日报、期刊
  • message(消息):消息id可用于防重、冥等性,key可用于路由算法topic分片(queue)。例:具体的一期报纸
  • tag(标签):类似子主题,可以在主题下进行拆分子类型, 可用于过滤。例:某日报、期刊的英文版、中文版
  • queue:topic的分片。例:家里7个信箱,报纸可以按所属星期分散存储到7个信箱里
  • producer-group:多个相同的procuder客户端组成。主要用于冗灾。例:邮局里多人小组负责同一区域报纸邮寄。
  • consumer-group:多个相同consumer客户端组成。例:家里由7口人,7个信箱,一个报纸只能由有一个人取到。
  • offset:主要用于consumer消费的下标。例:从信箱取报纸的期数,用户1读到了100期,用户2读取了102期,未完读可重复去信箱根据下标重新复制一份。
  • 消息顺序:全局要求只能有一个消息queue,多个queue存在并发场景不保证顺序。

namesvr

  • namesvr各节点无联系,存储的数据是等价相同的
  • namesvr接收并管理broker上报的各种注册元信息,cluster下,broker同时向所有节点上报,若出现任一节点挂掉,其他节点没影响
  • namesvr为producer、consumer提供发现服务,cluster下,client只会连接一个可用节点,若出现该节点挂掉,client将自动转移至其它可用的节点
  • namesvr将上报的信息都存储在内存中,同时通过心跳机制检测broker的可用性。注:支持持久化, 但一般不启用
  • namesvr存储的数据包括broker基本数据(节点信息等)及元数据(topic及message队列映射表等)
  • 源码底层通过封装netty来实现
  • 为什么不直接用zk?zk完全满足需求,但功能过多;避免过度依赖,保持中间件的轻量级,减少维护成本。

producer

默认实现

官方提供的默认消息发送实现方式涉及3个核心类,如下图
在这里插入图片描述

  • DefaultMQProducer为基础引导类,除了维护部分基础参数(name、重试次数等等)外,行为操作均为委托Impl,类似一个controller的角色
  • DefaultMQProducerImpl为DefaultMQProducer的委托类,是执行具体的业务逻辑实现,消息发送、回调及相关的逻辑分支处理,类似一个service角色
  • MQClientInstance用于client维护,用于和broker、namesvr交互,还包括负载、路由、状态存储管理等重要功能,类似一个dao但不止dao的角色。

官方提供了一个DefaultMQProducer的默认消息发送类,该类持有DefaultMQProducerImpl,该实现中引用一个MQClientFactory,

producer启动

在这里插入图片描述

  • 1:由producer引出,一线实现类为DefaultMQProducerImpl
  • 3:实现类初始化start(true),其中的true表示启用MqClientFactory
  • 4:checkconfig:检测包括namesvr、group等基本配置信息
  • 5:初始化MQClientInstance实例为mQClientFactory,并将该实例加入factoryTable
  • 7:执行starttopic对应的routeInfo
  • 9:执行向所有broker发送heartbeat

消息发送

以一个最低配置的消息发送为例

  • 初始化消息发送机制:消息机制CommunicationMode.SYNC, 消息回调, 发送超时时间
  • 获取topic信息,selector计算topic的message queue,并分配其中1个
  • 根据message queue信息获取broker相关信息,只会获取角色为master的broker
  • 组装其它默认参数,向broker发送消息请求
  • 接收到发送的消息sendResult进行相关校验回调操作
  • 超过发送阀值,消息将被置入“死信队列”

broker-mq核心

基本模型

在这里插入图片描述

  • cluster:集群,由多个节点组成逻辑群组。1个cluster可以拥有多个broker组
  • broker组:由节点组成小群组,有且只有一个master,0或多个slave
  • topic:消息主题,broker与topic为多对多关系
  • queue:message queue,1个topic对应1或多个queue(topic分片)

注:cluster和broker组均为逻辑概念,由各节点的clustername、brokername配置形成

集群模型

在这里插入图片描述

  • 上图为一个2主2从的典型broker模式
  • 1个集群(clustername相同为一个集群),2个组(brokername相同为一个组),4个节点(各组各1个master1个slave)
  • 图中含2个topic,topic1有2个分片(分布于broker1和broker2),topic2有3个分片(分布于broker1和broker2)
  • 同一个broker中的slave为均为master的镜像副本

内部模型

在这里插入图片描述

  • Remoting Module:一个netty服务端,用于接收并处理客户端请求
  • Client Manager:维护接入的producer和consumer的信息,包括各consumer组消费下标都在这里
  • Store Service:用于消息硬盘存储策略及实现
  • HA Service:主从节点的数据同步机制维护
  • Index Service:数据查询策略,索引机制管理及实现

存储机制

在这里插入图片描述

  • 使用mmap + write方式加快存盘及读取速度
  • commitLog:所有消息都存储于commitLog。完全顺序写,随机读(读操作时批量加载,内存缓存)
  • consumequeue:关联consumergroup–messagequeue的offset消费位置信息
  • 持久化:支持异步和同步。异步的意思为写入内存即响应,后台根据机制定期刷盘。同步表示刷盘后响应
  • 主从同步:2m-2s-async(主从异步); 2m-2s-sync(主从同步); 2m-noslave(仅master)

高可用

  • 发送消息:如果一个master挂掉,slave暂不支持自动升级为主(后续版本可能会支持)。此时,若消息被路由到该master,因该master不可用,因此消息分配至可用的master中。
  • 消费消息:master同时支持读写操作,若某master挂掉,系统会自动将从master中读消息切换至salve中,保证高可用。

consumer

push类型

在这里插入图片描述

  • DefaultMQPullConsumer 初始启动消费类
  • AllocateMessageQueueStrategy 指定消息分配策略实现,consumer获取可消费的topic分片(message queue列表
  • DefaultMQPullConsumerImpl 业务逻辑具体实现,同上方producer相关的impl
  • MQClientInstance 同上方producer的MQClientInstance相关说明

push流程

  • 该模式下,broker收到消息后,consumer,自动更新offset,client接收消息后自行处理
  • 类似kafka中的high-level
  • 增加新的consumer客户端后,系统会自动实现均衡,需要注意的是,cluster模式下,当同一个组的consumer客户端个数超过某个topic的message queue个数后,那么多出来的consumer客户端将无消息可用
    在这里插入图片描述
    rocketmq中的push,并非完全意义上的broker收到消息后立即推送给consumer,而是采用一种longpolling方式,pull和push相结合。

consumer根据自身消化消息的情况(未处理的消息个数、消息大小、offset跨度),判断是否需要从broker获取新消息

if 消化良好 then {consumer从broker pull消息
   if broker有新消息,则直接返回
   else broker没有新消息,broker隔段时间重试,检测到了就返回,超过一定时间仍然检测不到,则返回空。
}  else 消化不良:consumer继续处理未处理完的消息
  • 整体类似try(pull,timeout)
  • 作用:减少server的推送压力,降低server推送过快consumer消化不了的隐患

pull类型

在这里插入图片描述
注:pull主要类同push类型
pull流程

  • pull类型的特点是需要自行维护offset及异常处理
  • 相比于push,灵活度较高,自由优化空间大,适用于复杂场景下优化
  • 类比kafka中的simpleconsume
  • 主要操作:
  1. 获取message queue并遍历
  2. 维护处理offset
  3. 不同消息状态处理

总结
本文简要阐述了rocketmq浅层面的原理,可供一些常见故障排查定位。希望能对大家有所帮助,感谢!

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

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

相关文章

算法日记8:StarryCoding60(单调栈)

一、题目 二、解题思路: 题意为让我们找到每个元素的左边第一个比它小的元素,若不存在则输出-1 2.1法一:暴力(0n2) 首先,我们可以想到最朴素的算法:直接暴力两层for达成目标核心代码如下&…

map和set的使用(一)详解

文章目录 序列式容器和关联式容器map和set的介绍set构造和迭代器遍历和insertfinderaseswapclearcountlower_bound和upper_boundmultiset和set的对比 set的二个题目题目解析算法原理代码介绍一个找差集的算法同步算法题目解析算法原理代码 map构造遍历initiaizer_list 序列式容…

CSS布局与响应式

学习链接 Grid网格布局 前端五大主流网页布局 flex布局看这一篇就够了 grid布局看这一篇就够了 用六个案例学会响应式布局 伸缩盒响应式页面布局实战 实现响应式布局的五种方式 - csdn 如何完成响应式布局,有几种方法?看这个就够了 响应式布局总…

P6周:VGG-16算法-Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:Python 3.8.12 编译器:jupyter notebook 深度学习环境:torch 1.12.0cu113 一、前期准备 1.设置GPU im…

Git:问题解决办法 及 Tips 总结

目录 查看历史记录及比较区别查看所有提交的历史记录查看提交的详细历史记录查看提交之间的差异点击文件操作历史,筛选出所有改动过此文件的提交任意两个提交之间的比较(开发及查BUG常用) 在需要版本回滚的情况下处理方法短时间内无法彻查BUG…

【优选算法】----移动零

好久没写博客的兄弟姐妹们~ 今天来写一篇算法过过水吧~ --------------------------------------begin---------------------------------------- 题目要求: 给的难度是简单哦 题目解析: 这道题的思路可以借助双指针的思想,定义dest和c…

Solana 套利机器人原理

引言 加密货币的交易世界中,套利是利用市场价格差异进行无风险获利的一种策略。随着 DeFi(去中心化金融)的快速发展,套利机会屡见不鲜,尤其是在高速、高效能的区块链上,如 Solana。这些区块链通过提供低交易…

springboot自动配置原理(高低版本比较)spring.factories文件的作用

SpringBootApplication public class SpringSecurityApplication {public static void main(String[] args) {SpringApplication.run(SpringSecurityApplication.class, args);}}注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Doc…

总结4..

#include <stdio.h> // 定义全局变量n&#xff0c;用于表示二维数组的大小 // 定义二维数组b&#xff0c;用于标记找到单词的位置&#xff0c;初始化为0 int n, b[200][200] {0}; // 定义二维数组d&#xff0c;存储8个方向的偏移量&#xff0c;用于在二维数组中搜索…

从零开始:Spring Boot核心概念与架构解析

引言 在当今的Java开发领域&#xff0c;Spring Boot已经成为构建企业级应用的首选框架之一。它以其简洁、高效、易于上手的特点&#xff0c;极大地简化了Spring应用的开发过程。本文将从Spring Boot的核心概念入手&#xff0c;深入解析其架构设计和运行原理&#xff0c;帮助读…

深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件

在上一篇《深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比》发布之后&#xff0c;收到了大佬的“催稿”&#xff0c;想了解下 Flutter 和 Compose 在 PlatformView 实现上的对比&#xff0c;恰好过去写过不少 Flutter 上对于 PlatformView 的实现&#xff0c;这次恰好…

无人机飞手考证难度增加,实操、地面站教学技术详解

随着无人机技术的快速发展和广泛应用&#xff0c;无人机飞手考证的难度确实在不断增加。这主要体现在对飞手的实操技能和地面站操作技术的要求上。以下是对无人机飞手考证中实操和地面站教学技术的详细解析&#xff1a; 一、实操教学技术详解 1. 无人机基础知识学习&#xff1…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

知识图谱可视化:揭示隐藏的模式与关系

目录 前言1. 什么是知识图谱可视化1.1 知识图谱概述1.2 知识图谱可视化的定义 2. 知识图谱可视化的意义2.1 降低理解门槛2.2 帮助发现模式与洞察2.3 提升交互性与用户体验 3. 知识图谱可视化的技术实现3.1 数据处理与准备3.2 可视化技术3.3 用户交互设计 4. 知识图谱可视化的应…

深度学习基础--LSTM学习笔记(李沐《动手学习深度学习》)

前言 LSTM是RNN模型的升级版&#xff0c;神经网络模型较为复杂&#xff0c;这里是学习笔记的记录&#xff1b;LSTM比较复杂&#xff0c;可以先看&#xff1a; 深度学习基础–一文搞懂RNN 深度学习基础–GRU学习笔记(李沐《动手学习深度学习》) RNN&#xff1a;RNN讲解参考&am…

电气防火保护器为高校学生宿舍提供安全保障

摘 要&#xff1a;3月2日&#xff0c;清华大学紫荆学生公寓发生火情&#xff0c;无人员伤亡。推断起火原因系中厅内通电电器发生故障引燃周边可燃物所致。2月27日&#xff0c;贵州某高校女生宿舍发生火灾&#xff0c;现场明火得到有效控制&#xff0c;无人员受伤。2月19日&…

每打开一个chrome页面都会【自动打开F12开发者模式】,原因是 使用HBuilderX会影响谷歌浏览器的浏览模式

打开 HBuilderX&#xff0c;点击 运行 -> 运行到浏览器 -> 设置web服务器 -> 添加chrome浏览器安装路径 chrome谷歌浏览器插件 B站视频下载助手插件&#xff1a; 参考地址&#xff1a;Chrome插件 - B站下载助手&#xff08;轻松下载bilibili哔哩哔哩视频&#xff09…

C#使用WMI获取控制面板中安装的所有程序列表

C#使用WMI获取控制面板中安装的所有程序列表 WMI 全称Windows Management Instrumentation,Windows Management Instrumentation是Windows中用于提供共同的界面和对象模式以便访问有关操作系统、设备、应用程序和服务的管理信息。如果此服务被终止&#xff0c;多数基于 Windo…

企业级流程架构设计思路-基于价值链的流程架构

获取更多企业流程资料 纸上得来终觉浅&#xff0c;绝知此事要躬行 一.企业流程分级规则定义 1.流程分类分级的总体原则 2.完整的流程体系需要体现出流程的分类分级 03.通用的流程分级方法 04.流程分级的标准 二.企业流程架构设计原则 1.流程架构设计原则 流程框架是流程体…

PyTorch使用教程(8)-一文了解torchvision

一、什么是torchvision torchvision提供了丰富的功能&#xff0c;主要包括数据集、模型、转换工具和实用方法四大模块。数据集模块内置了多种广泛使用的图像和视频数据集&#xff0c;如ImageNet、CIFAR-10、MNIST等&#xff0c;方便开发者进行训练和评估。模型模块封装了大量经…