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

文章目录

  • 概述
  • 架构说明
    • 核心组件
    • 核心概念
  • 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浅层面的原理,可供一些常见故障排查定位。希望能对大家有所帮助,感谢!

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

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

相关文章

具身智能新突破!Physical Intelligence推出机器人动作tokenizer,训练提速5倍

具身智能,是人工智能(AI)行业的下一个浪潮。如何有效训练 Transformers 模型来控制具身机器人,是当前亟需要解决的难题,尤其是对于更复杂、需要精确和高频控制的精巧技能,现有的视觉-语言-动作(…

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…

【MySQL系列文章】Linux环境下安装部署MySQL

前言 本次安装部署主要针对Linux环境进行安装部署操作,系统位数64 getconf LONG_BIT 64MySQL版本&#xff1a;v5.7.38 一、下载MySQL MySQL下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 二、上传MySQL压缩包到Linuxx环境&#xff0c…

【排查案例】无认证集群空白分区创建元凶排查记录

无认证集群空白分区创建元凶排查记录 前言正文SparkSQL Thrift审计通过edit查找操作抓包分析请求NodeManager日志追踪结论 后记 前言 今天分享一个最近在生产环境排查的空白分区的问题&#xff0c;先说业务感知&#xff0c;业务那边反馈本身这条业务链每个小时数据应该是3个分…

音频入门(一):音频基础知识与分类的基本流程

音频信号和图像信号在做分类时的基本流程类似&#xff0c;区别就在于预处理部分存在不同&#xff1b;本文简单介绍了下音频处理的方法&#xff0c;以及利用深度学习模型分类的基本流程。 目录 一、音频信号简介 1. 什么是音频信号 2. 音频信号长什么样 二、音频的深度学习分…

语义分割文献阅读-SegNet:一种用于图像分割的深度卷积编码器-解码器架构(1.13-1.19)

目录 摘要 Abstract 1 引言 2 SegNet架构 2.1 编码器网络 2.2 解码器网络 2.3 最大池化索引(Max-pooling Indices) 3 训练SegNet 3.1 加载预训练权重 3.2 构建MyDataset类 3.3 训练 4 测试 总结 摘要 本周阅读的论文题目是《SegNet&#xff1a;A Deep Convoluti…

深度学习核函数

一、核函数的基本概念 核函数在机器学习中具有重要应用价值&#xff0c;常用于支持向量机&#xff08;SVM&#xff09;等算法中。 核函数是面试中经常被考到的知识点&#xff0c;对于找工作和实际数据转换都有重要作用。 二、数据建模与核函数的作用 数据越多&#xff0c;可…

.Net Core微服务入门全纪录(四)——Ocelot-API网关(上)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

2024年智慧消防一体化安全管控年度回顾与2025年预测

随着科技的飞速发展&#xff0c;智慧营区一体化安全管控在2024年取得了显著进展&#xff0c;同时也为2025年的发展奠定了坚实基础。 2024年年度回顾 政策支持力度持续加大&#xff1a;国家对消防安全的重视程度不断提高&#xff0c;出台了一系列涵盖技术创新、市场应用、人才培…

抖音小程序一键获取手机号

前端代码组件 <button v-if"!isFromOrderList"class"get-phone-btn" open-type"getPhoneNumber"getphonenumber"onGetPhoneNumber">一键获取</button>// 获取手机号回调onGetPhoneNumber(e) {var that this tt.login({f…

【线性代数】列主元法求矩阵的逆

列主元方法是一种用于求解矩阵逆的数值方法&#xff0c;特别适用于在计算机上实现。其基本思想是通过高斯消元法将矩阵转换为上三角矩阵&#xff0c;然后通过回代求解矩阵的逆。以下是列主元方法求解矩阵 A A A 的逆的步骤&#xff1a; [精确算法] 列主元高斯消元法 步骤 1&am…

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

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

后端面试题分享第一弹(状态码、进程线程、TCPUDP)

后端面试题分享第一弹 1. 如何查看状态码&#xff0c;状态码含义 在Web开发和调试过程中&#xff0c;HTTP状态码是了解请求处理情况的重要工具。 查看状态码的步骤 打开开发者工具&#xff1a; 在大多数浏览器中&#xff0c;您可以通过按下 F12 键或右键单击页面并选择“检查…

7、数组知识点汇总

一、 数组基本概念 程序算法数据结构 算法&#xff1a;解决程序的流程步骤数据结构&#xff1a;将数据按照某种特定的结构来存储设计良好的数据结构会导致良好的算法。ArrayList、LinkedList 数组是最简单的数据结构。 1、数组&#xff1a; 数组&#xff1a;存放同一种类型…

计算机网络 (48)P2P应用

前言 计算机网络中的P2P&#xff08;Peer to Peer&#xff0c;点对点&#xff09;应用是一种去中心化的网络通信模式&#xff0c;它允许设备&#xff08;或节点&#xff09;直接连接并共享资源&#xff0c;而无需传统的客户端-服务器模型。 一、P2P技术原理 去中心化架构&#…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

包文件分析器 Webpack Bundle Analyzer

webpack-bundle-analyzer 是一个非常有用的工具&#xff0c;用于可视化和分析 Webpack 打包生成的文件。这使得开发者能够更好地理解应用的依赖关系、包的大小&#xff0c;以及优化打包的机会。以下是关于 webpack-bundle-analyzer 的详细介绍&#xff0c;包括它的安装、使用以…

重学SpringBoot3-WebClient配置与使用详解

更多SpringBoot3内容请关注我的专栏&#xff1a;《SpringBoot3》 期待您的点赞??收藏评论 重学SpringBoot3-WebClient配置与使用详解 1. 简介2. 环境准备 2.1 依赖配置 3. WebClient配置 3.1 基础配置3.2 高级配置3.3 retrieve()和exchange()区别 4. 使用示例 4.1 基本请求操…

持续升级《在线写python》小程序的功能,文章页增加一键复制功能,并自动去掉html标签

增加复制按钮后的界面是这样的 代码如下&#xff1a; <template><view><x-header></x-header><view class"" v-if"article_info"><view class"kuai bgf"><view class"ac fs26"><img sr…

今天也是记录小程序进展的一天(破晓时8)

嗨嗨嗨朋友们&#xff0c;今天又来记录一下小程序的进展啦&#xff01;真是太激动了&#xff0c;项目又迈出了重要的一步&#xff0c;231啦&#xff01;感觉每一步的努力都在积累&#xff0c;功能逐渐完善&#xff0c;离最终上线的目标越来越近了。大家一直支持着这个项目&…