RocketMQ总结

深入理解RocketMQ三高架构设计

高性能

  1. 顺序写磁盘 + mmap 零拷贝
  2. 异步刷盘 + 刷盘策略可配置
  3. 轻量网络协议 + 长连接复用

高可用

  1. 主从复制机制、controller、dledger集群
  2. NameServer 多副本无状态
  3. 客户端自动切换 Broker
  4. 消息刷盘机制保障可靠性

高可扩展性

  1. Broker 水平扩展
  2. Consumer 分组机制
  3. Topic/Queue 灵活路由
  4. 插件式架构设计

快速梳理RocketMQ客户端消息模型

三大核心角色

角色说明
Producer(生产者)发送消息到 Broker。支持同步、异步、单向三种发送方式。
Consumer(消费者)从 Broker 拉取消息进行消费。支持推模式(Push)和拉模式(Pull)。
NameServer提供路由发现服务。Producer/Consumer 都通过它查找 Broker 地址。

五大关键过程

  1. Producer 启动流程

    • 初始化 MQClientInstance;
    • 向 NameServer 拉取路由信息;
    • 建立与 Broker 的连接(Netty 长连接);
    • 注册自身到 Topic 路由表。
  2. 消息发送流程
    生产者发送消息时:

    1. 从缓存中查找 Topic 对应的路由信息;
    2. 按策略选择一个队列(MessageQueue);
    3. 通过 Netty 将消息发送到对应的 Broker;
    4. 根据配置选择:
      • 同步发送:等待返回确认;
      • 异步发送:注册回调函数;
      • 单向发送:不关心发送结果,适用于日志类数据。
  3. Consumer 启动流程
    消费者启动时:

    1. 初始化 MQClientInstance;
    2. 向 NameServer 拉取 Topic 路由;
    3. 与 Broker 建立连接;
    4. 根据消费模式(Push/Pull)拉取消息。
  4. 消息消费流程
    支持两种消费模式:

    模式说明
    Push 模式(默认)实际是 Broker 定期向 Consumer 主动推送拉取请求。
    Pull 模式Consumer 主动向 Broker 拉取消息。

    消费进度(offset)根据消费模式不同,也有两种:
    - 集群模式(Clustering) :队列在多个消费者之间分摊;
    - 广播模式(Broadcasting) :每个消费者都消费所有消息。

  5. 消费确认与重试机制

    • 消费成功:Consumer 会定期上报消费进度;
    • 消费失败:
      • 可自动重试(重投到 RETRY_TOPIC);
      • 或转移到死信队列(DLQ)。

结合源码理解RocketMQ高性能实现细节

方面实现机制
消息写入顺序写磁盘 + MappedByteBuffer + 异步刷盘
消息读取消费队列(ConsumeQueue)+ 索引文件(IndexFile)
通信框架高性能 Netty + 自定义轻量协议
路由发现NameServer 提前缓存路由,无需频繁请求
网络效率长连接复用 + 请求压缩 + 线程池模型

全面思考RocketMQ的集群架构

RocketMQ 集群核心角色

角色描述
NameServer类似于注册中心,管理路由信息,支持无状态集群部署
Broker真正存储消息的服务。可部署为主从结构
Producer消息生产者,连接 NameServer 获取路由,再将消息发送至 Broker
Consumer消息消费者,从 Broker 拉取并消费消息

架构特性与设计思想

  1. NameServer(服务发现)
  • 无状态部署,支持多个节点;
  • Producer/Consumer 启动时从多个 NameServer 拉取 Broker 路由信息;
  • 路由信息是 Broker 主动注册 到 NameServer 的;
  • 支持故障容忍(某个 NameServer 掉线不影响整体)。
  1. Broker(核心)
    每个 Broker 有唯一标识(brokerName + brokerId):
  • brokerId = 0:Master
  • brokerId > 0:Slave
    每个 Topic 可以配置多个队列分布在不同的 Broker 上。
    主从同步方式
同步模式描述
ASYNC_MASTER异步同步(默认),写成功不等待 Slave,同步失败不影响写入
SYNC_MASTER同步刷盘,写消息时等待 Slave 确认,提高可靠性
SLAVE只做备份,不接收写请求,不参与消费
  1. Producer 工作机制
  • 从 NameServer 获取最新 Topic 路由;
  • 通过负载均衡策略选择队列(MessageQueue);
  • 支持三种发送方式(同步/异步/单向);
  • 自动感知路由变化,动态调整发送目标。
  1. Consumer 工作机制
  • 支持两种消费模式:

    • 集群模式(Clustering):多个消费者共享消息
    • 广播模式(Broadcasting):每个消费者都消费所有消息
  • 支持 Push 和 Pull 模式;

  • 消费进度保存在 Broker(默认)或本地(广播模式);

  • 支持负载均衡重新分配队列(Rebalance)。

集群高可用与容错机制

机制实现
主从容灾Master 挂了,Slave 不自动转正,需人工或运维系统切换
NameServer 容灾Producer/Consumer 配置多个 NameServer,自动重试
消息重试机制消费失败支持自动重试、死信队列
刷盘策略保障数据同步刷盘 + SYNC_MASTER 可实现消息 0 丢失(牺牲部分性能)

生产环境RocketMQ常见问题处理思路

MQ消息零丢失方案总结

各种防止MQ消息丢失的方案,本质上都是以牺牲系统性能和吞吐量为代价的。这种资源消耗必然会导致集群整体效率的下降。在实际业务场景中,我们需要根据具体需求对这些安全方案进行权衡取舍。

  1. 生产者发送消息如何保证不丢失
    • 同步发送+多次尝试(降低吞吐)
    • 异步发送(增加生产者客户端负担)
    • 事务消息机制(多次网络请求)
  2. Broker写入数据如何保证不丢失
    • 同步刷盘(I/O负担)
    • Dledger集群(网络负担)
  3. 消费者消费消息如何不丢失
    • 同步处理消息,再提交offset(无法通过异步提高吞吐)
  4. 如果MQ服务全部挂了,如何保证不丢失
    • 增加临时的降级存储

MQ如何保证消息的顺序性

强调局部有序而不是全局有序

  1. Producer将一组有序的消息写入到同一个MessageQueue中。
  2. Consumer每次只有单个线程能从一个同一个TopicMessageQueue中拿取消息。
    在这里插入图片描述

MQ如何保证消息幂等性

  1. 生产者发送消息到服务端如何保持幂等
    Producer发送消息时,如果采用发送者确认的机制,Producer发送消息会等待Broker的响应。若未收到响应,Producer将自动重试发送。然而,这种情况也可能发生在消息已被处理成功处理但确认响应丢失的场景中,从而导致消息重复发送的问题。
    RocketMQ的处理方式,是会在发送消息时,给每条消息分配一个唯一的ID。

  2. 消费者消费消息如何保持幂等、
    RocketMQ官网明确做了回答:RocketMQ确保所有消息至少传递一次。在大多数情况下,消息不会重复。
    防止重复消费的关键在于确定一个可靠的唯一性标识。RocketMQ为每条消息自动分配了唯一的messageId,消费者可以通过获取这个messageId来实现去重。将已处理的messageId记录下来,就能有效判断消息是否重复消费。

    数据库的兜底方案则是在某些适用的场景下设置唯一键,插入重复的唯一键自然会报错回滚。

MQ如何快速处理积压的消息

  1. 消息积压会有哪些问题
    RocketMQ和Kafka都具备出色的消息积压处理能力,短期的消息堆积通常不会造成问题。然而需要警惕的是,若积压问题长期得不到解决,当日志文件过期时,系统会自动删除这些过期文件,导致其中未被消费的消息永久丢失。

  2. 怎么处理大量积压的消息

  • RabbitMQ
    如果是Classic Queue经典对列,那么针对同一个Queue的多个消费者,是按照Work Queue的模式,在多个Consuemr之间依次分配消息的。所以这时,如果Consumer消费能力不够,那么直接加更多的Consumer实例就可以了。这里需要注意下的是如果各个Consumer实例他们的运行环境,或者是处理消息的速度有差别。那么可以优化一下每个Consumer的比重(Qos属性),从而尽量大的发挥Consumer实例的性能。

  • RocketMQ和Kafka
    因为同一个消费者组下的多个Cosumer需要和对应Topic下的MessageQueue建立对应关系,而一个MessageQueue最多只能被一个Consumer消费,因此,增加的Consumer实例最多也只能和Topic下的MessageQueue个数相同。如果此时再继续增加Consumer的实例,那么就会有些Consumer实例是没有MessageQueue去消费的,因此也就没有用了。
    在这里插入图片描述
    如果Topic下的MessageQueue配置本来就不够多的话,那就无法一直增加Consumer节点个数了。
    如果要快速处理积压的消息,可以创建一个新的Topic,配置足够多的MessageQueue。然后把Consumer实例的Topic转向新的Topic,并紧急上线一组新的消费者,只负责消费旧Topic中的消息,并转存到新的Topic中。这个速度明显会比普通Consumer处理业务逻辑要快很多。然后在新的Topic上,就可以通过添加消费者个数来提高消费速度了。之后再根据情况考虑是否要恢复成正常情况。

    类似固定级别的延迟消息机制,把消息临时转到一个系统内部的Topic下,处理过后,再转回来。

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

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

相关文章

vue3+tdesign实现明暗主题切换

很多项目中有些会涉及到明暗主题切换的功能,今天就来梳理一下有关这方面的具体实现步骤和使用到的方法,本篇文章使用到的组件是tdesign,利用部分案例,主要阐述明暗主题切换的技术原理和实现步骤,仅供参考。 目录 一、…

goland 的 dug 设置

brew install delve # 或通过go install go install github.com/go-delve/delve/cmd/dlvlatestwhere dlvdlv.path/your/path/to/dlv环境变量 DEPLOY_MODEprivate;EGO_DEBUGtrue;EGO_MODEdev;MO_MODEdev;PD_MODEco;PRODUCT_MODEall

CVE-2020-1938源码分析与漏洞复现(Tomcat 文件包含/读取)

漏洞概述 漏洞名称:Tomcat AJP协议文件包含/读取漏洞(Ghostcat) CVE 编号:CVE-2020-1938 CVSS 评分:9.8 影响版本: Apache Tomcat 6.x (≤ 6.0.53)Apache Tomcat 7.x (≤ 7.0.99)Apache Tomcat 8.x (≤ 8…

基于51单片机的简易打铃系统

目录 具体实现功能 设计介绍 资料内容 全部内容 资料获取 具体实现功能 具体功能: (1)实时显示当前时间(时、分、秒),LED模式指示灯亮;4个按键可以调整时间的时和分。 (2&…

vue+cesium示例:3D热力图(附源码下载)

接到一位知识星友的邀请,随机模拟三维数据点,结合heatmap.js实现基于cesiumvue的3D热力图需求,适合学习Cesium与前端框架结合开发3D可视化项目。 demo源码运行环境以及配置 运行环境:依赖Node安装环境,demo本地Node版本…

批处理实现:自动抓取perfetto日志 自动导出到当前文件夹 自动打开分析页面

序言 最近在研究性能问题需要抓取trace文件。于是写了个脚本 使用 双击运行批处理文件,可以开始记录trace。而且以当前文件夹下面的。config.pbtx 作为配置文件。 (pbtx就是一个json文件。配置了需要抓取那些参数,可以通过https://ui.per…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

​​Promise代码理解

1.事件循环与 Promise 执行顺序 案例 1:基础 Promise 同步异步区分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 输出顺序:1,2,3…

57、原生组件注入-【源码分析】DispatcherServlet注入原理

57、原生组件注入DispatcherServlet注入原理 #### 继承关系 - DispatcherServlet继承自FrameworkServlet,而FrameworkServlet继承自HttpServletBean,最终HttpServletBean继承自HttpServlet。 - DispatcherServlet实现了ApplicationContextAware接口。 …

【动手学深度学习】3.5. 图像分类数据集

目录 3.5. 图像分类数据集1)读取数据集2)读取小批量3)整合所有组件4)小结 . 3.5. 图像分类数据集 我们将使用Fashion-MNIST数据集,作为图像分类数据集。 %matplotlib inline import torch import torchvision from …

Python的格式化输入输出

# Python 的格式化输出和格式化输入## 格式化输出Python 提供了多种字符串格式化的方法:### 1. % 格式化(旧式格式化)python name "Alice" age 25 print("Name: %s, Age: %d" % (name, age)) # 输出: Name: Alice, Age…

day65—回溯—单词搜索(LeetCode-79)

题目描述 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相…

iOS安全和逆向系列教程 第19篇:ARM64汇编语言基础与逆向分析

引言 在成功掌握iOS应用脱壳技术后,我们获得了可以进行静态分析的二进制文件。然而,要真正理解iOS应用的底层逻辑,我们必须深入到汇编语言层面。ARM64(也称为AArch64)是苹果在iPhone 5s及以后设备中使用的指令集架构。本篇文章将深入探讨ARM64汇编语言的基础知识,并结合…

使用Gitlab CI/CD结合docker容器实现自动化部署

Gitlab CI/CD基本介绍 核心概念 持续集成(CI):每次代码提交后自动触发构建、测试和代码检查,确保代码质量 持续交付/部署(CD):在 CI 基础上自动将代码部署到测试或生产环境,支持人工…

初学者运行Pycharm程序可能会出现的问题,及解决办法

文章目录 前言一、ModuleNotFoundError: No module named sklearn二、ImportError: cannot import name show_config from numpy (unknown location)三、Pycharm报错:“Original error was: DLL load failed: 找不到指定的模块“ 的解决办法四、ImportError: cannot…

Android开发中的Java与Kotlin:全面对比与深度解析

Android开发中的Java与Kotlin:全面对比与深度解析 在Android开发领域,Java和Kotlin是两种主流编程语言。自Google在2017年宣布Kotlin为Android官方支持语言以来,Kotlin凭借其现代语法特性和与Java的无缝兼容性,逐渐成为开发者的新…

为应对激烈竞争环境,IBMS系统如何提升企业管理效率

IBMS智能管理系统:赋能企业高效运营,决胜竞争新时代 在瞬息万变的商业环境中,效率就是竞争力!企业如何快速响应市场变化、优化内部流程、降低成本并实现精准决策?IBMS智能管理系统以创新科技为引擎,为企业…

2.3 ASPICE的架构与设计

在ASPICE中,架构与设计是汽车软件开发过程中非常重要的一环,它涉及到定义和设计软件系统的整体结构、组件以及其相互关系。良好的架构与设计可以帮助团队更好地理解和管理软件系统,提高系统的可维护性、可扩展性和性能。以下是ASPICE中架构与…

生益PCB耐高温PCB板材怎么样?

在5G基站昼夜不停地吞吐数据时,在新能源汽车电池管理系统经受极寒酷暑考验时,在航空航天器穿越大气层承受2000℃热浪冲击时,一块优质PCB板材的“抗热基因”正在决定着整个系统的生死存亡。生益科技研发的耐高温PCB板材,正是在这场…

Java Spring ApplicationEvent 概述

一、Spring 事件机制核心概念 1. 事件驱动架构模型 发布-订阅模式:解耦事件生产者和消费者观察者模式:监听器监听特定事件事件驱动优势: 组件间松耦合系统扩展性好支持异步处理事件溯源支持 2. 核心组件 组件作用实现方式ApplicationEve…