RocketMQ的集群架构是怎样的?
大家好,我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助;

RocketMQ的集群架构是怎样的?
1000道 互联网大厂Java工程师 精选面试题-Java资源分享网
RocketMQ 是阿里巴巴开源的分布式消息中间件,广泛用于处理高吞吐量、高可用的消息队列服务。它的集群架构设计非常注重高可用性、可扩展性和高效性。以下是 RocketMQ 的集群架构主要组件和工作原理:
1. 集群组成
RocketMQ 的集群架构主要由以下几部分组成:
-
NameServer:分布式的注册中心,类似于服务发现的功能。它用于存储和维护消息队列的元数据信息(如Broker的地址、Topic和Queue的映射关系等),并且提供消息路由功能。客户端在启动时会从 NameServer 获取可用的 Broker 地址,然后进行连接和消息发送。
-
Broker:消息存储的核心组件,负责实际的消息存储和处理。Broker 存储着消息、处理消费者请求、将消息发送给消费者等。一个 RocketMQ 集群通常包含多个 Broker 实例,以保证高可用和高吞吐量。
-
Producer:消息生产者,负责将消息发送到 RocketMQ 集群中。Producer 会向 NameServer 查询 Broker 地址,然后将消息发送到相应的 Broker。
-
Consumer:消息消费者,负责从 Broker 拉取消息并处理。Consumer 可以通过订阅指定的 Topic 获取消息,也可以是集群模式(多个 Consumer 实例)或者广播模式(一个 Consumer 实例消费所有消息)。
-
Admin:用于管理和监控 RocketMQ 集群的工具。管理员可以通过 Admin 操作对集群进行控制,如创建、删除 Topic,查看消息状态等。
2. Broker 的架构
Broker 是 RocketMQ 的核心部分,它负责消息的存储、分发和消费。每个 Broker 由以下几个主要组成部分:
-
消息存储(Message Storage):Broker 将消息存储到磁盘中,每个 Topic 会划分成多个队列(Queue),每个队列内存储着该队列对应的消息。RocketMQ 默认使用 CommitLog 文件来存储消息,并且每个 Topic 可以由多个消息队列组成。
-
消息调度(Message Dispatching):Broker 负责将生产者发送的消息调度到对应的队列中,同时将消息分发给消费该队列的 Consumer。
-
消费进度(Consumer Offset):Broker 会维护消费者的消费进度。当一个 Consumer 拉取消息后,Broker 会记录该消费者的消费偏移量(Offset),并且当该 Consumer 下次消费时会从上次的 Offset 开始拉取消息。
-
集群模式和主从架构:RocketMQ 支持 Broker 集群模式,可以有多个 Broker 来处理不同的 Topic 和队列。为了保证高可用性,RocketMQ 中的 Broker 支持主从复制架构,每个 Broker 可以有一个主节点和多个从节点。主节点负责消息的写入和同步,而从节点负责消息的读取以及对主节点的消息同步。这样可以在主节点故障时,由从节点接管,保证系统的高可用。
3. 消息存储和高可用机制
RocketMQ 提供了强大的消息存储和高可用机制:
-
CommitLog 和 ConsumeQueue:RocketMQ 使用两个核心文件来存储消息和消费进度:
- CommitLog:记录所有的消息。每条消息都会被追加写入到 CommitLog 文件中。
- ConsumeQueue:记录消息的消费进度和索引信息,Consumer 会根据 ConsumeQueue 中的索引来快速定位消息的位置。
-
主从复制:每个 Broker 会有一个主节点和多个从节点(也称为 Slave)。主节点处理写入请求,而从节点从主节点同步消息。当主节点故障时,从节点会自动升级为主节点,保证消息的高可用性。
-
消息同步与异步:RocketMQ 支持同步和异步消息同步机制。在同步模式下,消息写入主节点后会等待从节点同步完成后再返回给生产者,保证消息的可靠性;而在异步模式下,消息写入主节点后立即返回,性能较高,但会有一定的消息丢失风险。
4. 集群中的高可用与负载均衡
RocketMQ 采用了分布式架构中的一些高可用设计:
-
多 Broker 集群:一个 RocketMQ 集群通常包含多个 Broker,每个 Broker 负责处理不同的队列。通过多个 Broker 分摊负载,提升吞吐量和并发处理能力。
-
负载均衡:Producer 会向多个 Broker 发送消息,Broker 之间会进行负载均衡,确保每个 Broker 的负载不会过高,同时保持消息的顺序性和一致性。
-
容错和故障恢复:当某个 Broker 或其主节点出现故障时,RocketMQ 会自动将故障的 Broker 替换为健康的从节点,保证系统持续可用。
5. 消息顺序保证
RocketMQ 支持消息的顺序保证,但有一些限制:
- 顺序消息:RocketMQ 可以保证单个队列内的消息顺序,即同一个消息队列中的消息按照生产者发送的顺序消费。
- 分区顺序:如果 Topic 被划分为多个队列,RocketMQ 会在生产者发送消息时,将不同的消息分配到不同的队列上。这些消息在不同队列内的顺序可能会丢失,但同一队列内的顺序会被保证。
6. 消息路由
RocketMQ 使用了 NameServer 进行消息路由的管理。Producer 和 Consumer 启动时会向 NameServer 请求 Broker 列表,NameServer 会根据负载和策略选择合适的 Broker 来进行消息发送或消费。
7. 集群扩展性
RocketMQ 支持横向扩展,可以根据实际需求添加更多的 Broker 或者增加 Topic 和队列的数量,以提高消息的吞吐量和集群的并发能力。
总结
RocketMQ 的集群架构通过分布式设计、高可用的主从架构、负载均衡、消息存储优化等机制,能够支持高并发、高吞吐量的消息服务。它的灵活性和扩展性使得 RocketMQ 可以适应不同规模和业务需求的消息传递场景。在实际使用中,通过合适的配置和集群管理,RocketMQ 可以很好地处理大规模的分布式消息传递任务。
相关文章:
RocketMQ的集群架构是怎样的?
大家好,我是锋哥。今天分享关于【RocketMQ的集群架构是怎样的?】面试题。希望对大家有帮助; RocketMQ的集群架构是怎样的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 是阿里巴巴开源的分布式消息中间件,广泛用于处…...
VS2022+QT6.7 窗口置灰(遮罩)
本文章使用QWidget来使窗口置灰,使用按钮控制置灰功能的开启和关闭,同时被置灰的控件自动禁用交互功能。 connect(ui.pushButton_open, &QPushButton::clicked, this, []() { //创建无边框窗口,大小是父的大小QWidget* parentWidget new QWidget…...
如何通过HTTP API插入或更新Doc
本文介绍如何通过HTTP API向Collection中插入或更新Doc。 说明 若调用本接口时Doc Id已存在,则等同于更新Doc;Doc Id不存在,则等同于插入Doc。 若调用本接口时不指定Doc Id,则等同于插入Doc,DashVector会自动生成Doc …...
C++ STM32 F4xx USART LL库 DMA + IDLE ISR 驱动裸机 +FreeRTOS 任务通知
写的一般,大佬可以帮我看看 头文件 /********************************************************************************* file : usart_driver.hpp* brief : usart_driver program head**************************************************…...
RK3588在Android13/14如何查看GPU,NPU,DDR,RGA数据
由于Android13上selinux的权限管控加强,原来android12的方法已经无法获取到性能相关数据了,故单独介绍Android13上的性能数据获取 首先需要保障能过获取到root权限,adb root能够生效,adb shell进入shell命令行 mount -t debugfs…...
sentinel学习笔记6-限流降级(上)
本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏,写的好值得推荐,我整理的有所删减,推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…...
【Rust自学】6.4. 简单的控制流-if let
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 6.4.1. 什么是if let if let语法允许将if和let组合成一种不太冗长的方式来处理与一种模式匹配的值,同时忽略其余模式。 可以…...
【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下
【HarmonyOS】鸿蒙将资源文件夹Resource-RawFile下的文件存放到沙箱目录下 一、问题背景 应用开发中,我们经常会遇到一些文件原先是放在资源文件夹 rawfile下,但是逻辑处理时,需要转移到本地沙箱才能操作。这种情况下,就需要将将…...
Vue项目中env文件的作用和配置
在实际项目的开发中,我们一般会经历项目的开发阶段、测试阶段和最终上线阶段,每一个阶段对于项目代码的要求可能都不尽相同,那么我们如何能够游刃有余的在不同阶段下使我们的项目呈现不同的效果,使用不同的功能呢?这里…...
在 Vue3 项目中实现计时器组件的使用(Vite+Vue3+Node+npm+Element-plus,附测试代码)
一、概述 记录时间 [2024-12-26] 本文讲述如何在 Vue3 项目中使用计时器组件。具体包括开发环境的配置,ViteVue 项目的创建,Element Plus 插件的使用,以及计时器组件的创建和使用。 想要直接实现计时器组件,查看文章的第四部分。…...
机器人C++开源库The Robotics Library (RL)使用手册(三)
进入VS工程,我们先看看这些功能函数及其依赖库的分布关系: rl命名空间下,主要有八大模块。 搞定VS后将逐个拆解。 1、编译运行 根据报错提示,配置相应错误的库(根据每个人安装位置不同而不同,我的路径如下:) 编译所有,Release版本耗时大约10分钟。 以rlPlan运动…...
Photoshop启动错误:找不到MSVCP140.dll的多步骤解决指南
在使用Adobe Photoshop(简称PS)进行创意设计或图像编辑时,有时会遇到软件启动报错的情况,其中“找不到MSVCP140.dll,无法继续执行代码”是一个常见的错误提示。这个错误通常意味着你的系统缺少了Microsoft Visual C Re…...
mac中idea菜单工具栏没有git图标了
1.右击菜单工具栏 2.选中VCS,点击添加 3.搜索你要的工具,选中点击确定就添加了 4.回到上面一个界面,选中你要放到工具栏的工具,点击应用就好了 5.修改图标,快捷键或者右击选中编辑图标 6.选择你要的图标就好了...
学习threejs,PerspectiveCamera透视相机和OrthographicCamera正交相机对比
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.PerspectiveCamera透…...
C#数学相关开发性能优化方法
本文Github地址:CSharp-MathOptimization.md 华为公司的C语言编程规范在开头就强调了: 一般情况下,代码的可阅读性高于性能,只有确定性能是瓶颈时,才应该主动优化。 本文讲述的方法没有经过大项目和大公司的检验&…...
【前沿 热点 顶会】AAAI 2025中与目标检测有关的论文
CP-DETR: Concept Prompt Guide DETR Toward Stronger Universal Object Detection(AAAI 2025) 最近关于通用物体检测的研究旨在将语言引入最先进的闭集检测器,然后通过构建大规模(文本区域)数据集进行训练࿰…...
APP投放的归因框架设计
一、归因相关概念回顾 在广告归因简介中我们介绍常见的归因模型和归因方法,我们先来回顾一下: 1. 背景 2. 设备标识 3. 归因模型 归因模型的多样性意味着每种模型都有其独特的优势和局限。关键在于选择一个与您的业务场景相匹配的模型,并且…...
职业生涯记录-1
机缘 普通人改命,要学会向上社交,能自然融入的圈子,多数是往下社交,没有多少价值,想要获取更多资源,但是有钱人只跟有钱人交朋友,不会带我们普通人玩,又错了,有钱人身边最不缺的就是有钱人,他们缺的是对他们有利用价值的朋友,往上社交的关键,你必须是个对他有利用价…...
江苏捷科云:可视化平台助力制造企业智能化管理
公司简介 江苏捷科云信息科技有限公司(以下简称“捷科”)是一家专注于云平台、云储存、云管理等产品领域的创新型企业,集研发、生产和销售于一体,致力于在网络技术领域打造尖端品牌。在推动制造业企业数字化转型的进程中…...
【ES6复习笔记】Promise对象详解(12)
1. 什么是 Promise? Promise 是 JavaScript 中处理异步操作的一种机制,它可以让异步操作更加容易管理和控制。Promise 对象代表一个异步操作的最终完成或失败,并提供了一种方式来处理操作的结果。 2. Promise 的基本语法 Promise 对象有三…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
