消息队列

基本概念

定义

消息队列(Message Queue, MQ)是一种分布式中间件,通过异步通信、消息暂存和解耦生产消费双方的机制,提供消息的顺序性保证、可靠投递和流量控制能力,广泛应用于微服务解耦、大数据流处理等场景。

核心组件

生产者 producer:消息的生产者,负责发送消息。

消费者 consumer:消息的消费者,订阅并处理消息。

消费者组 consumer group:所有消费者都属于某一消费者组,同一个消费者组内的消费者共同消费同一类型的消息,实现消费性能的扩展。

租户 tenant:逻辑概念,是资源归属和权限控制的基本单位。

集群 cluster:一组节点的集合。

Broker:用于存储和转发消息的物理节点。

主题 topic:逻辑概念,同一种业务类型的消息的集合。

偏移量 offset:消息的唯一标识,由消费者返回,记录目前消费的位置。

消息模型

点对点:消息被单个消费者消费,如订单处理。

发布/订阅:消息广播给多个消费者,如新闻推送。

核心功能

功能

说明

服务解耦

解除多个业务系统之间的耦合度,减少系统之间影响

异步通信

生产者和消费者无需同时在线,通过消息队列暂存消息实现异步通信

流量控制

削峰填谷,突发流量被队列缓冲,避免压垮下游系统

顺序收发

先进先出,保证消息的顺序性(全局有序或分区有序)

零拷贝

通过 OS 和硬件协作,减少数据在内存中的冗余复制,实现高吞吐

消息回溯

 offset 到指定位置,重新消费历史消息

应用场景

大数据流处理:实时数据处理 ETL

金融支付对账、交易流水

物联网设备指令下发、状态上报

微服务:服务 A 通过 MQ 通知服务 B,避免直接 HTTP 调用带来的耦合和超时风险

Kafka

架构设计

1.  生产者从 ZooKeeper* 获取 Topic 的元数据(如 Partition Leader 的位置)后,以 push 模式发布消息到对应的 broker 上。

2.  每条消息都属于一个 Topic,每个 Topic 分为多个 Partition 分区,物理上由多个日志分片 Segment 文件组成。每个 Partition 都有多个副本,被存储在不同的 Brokers 上。消息发送到 Leader 后,会同步到 Follower 以确保冗余。

3.  消费者以 pull 模式从 Leader 主副本里拉取消息,返回 offset 值用于记录现在消费的位置。

* ZooKeeper 的核心作用

功能

说明

Broker 注册

Broker 启动时向 ZooKeeper 注册自己的地址和 Partition 分配情况

Leader 选举

当 Leader Partition 宕机时,协助选举新的 Leader

Topic 配置管理

存储 Topic 的 Partition 数量、副本因子等元数据

功能原理

1.  持久化:消息存储在 broker 磁盘中,被消费后不会立即被删除

2.  高吞吐:单个 partition 批处理,多个 partition 并行处理

3.  高扩展:topic 分区化,存储在不同 brokers 中

4.  容灾和高可用:每个 partition 都有多个副本,ISR 确保副本之间的同步

5.  低延迟:稀疏索引和二分查找

RocketMQ

架构设计

1.  生产者向 NameServer 查询 Topic 的路由信息,选择目标 MessageQueue。

2.  发送消息到对应的 Master Broker,同步到 Slave。

3.  消费者从 NameServer 获取 Topic 的路由信息,从 Master Broker 拉取消息,定期提交 Offset 到 Broker。

功能原理

1.  金融级可靠

同步刷盘

所有消息先写入磁盘后才返回 ACK,确保数据不丢失

主从同步复制

消息必须同步到 Slave 节点后才响应生产者,避免主节点宕机丢数据

Broker 主从切换

Master 故障时,Slave 自动提升为新 Master

多副本

支持多副本,数据分布在不同物理机/机架

严格的顺序性

同一队列的消息严格 FIFO,适用于金融交易(如订单状态变更)

死信队列

处理失败的消息自动进入 DLQ,避免阻塞正常流程

2.  事务消息:两阶段提交

生产者发送一条对消费者不可见的半消息(Half Message)到 Broker,Broker 持久化该消息,但不会将其投递给消费者。

生产者执行本地数据库操作后,根据本地事务结果,向 Broker 发送 Commit 或 Rollback 指令。

仅当收到 Commit 后,Broker 才将消息标记为可消费,后续推送给消费者,以确保本地数据库事务和消息发送两个操作的原子性。

3.  消息过滤:基于 tag 或 sql 语句进行过滤,在服务端将符合条件的消息投递给消费者。

Pulsar

产品架构设计

* Segment 即 BookKeeper 的 Ledger,是一种 append-only 的日志文件

1.  生产者查询 Topic 路由,将消息发送到对应的 Broker

2.  消息被拆分为多个 Segment,broker 将消息写到多个 bookie 中持久化存储同一个 partition 的 segment 分散在多个 bookie,支持多个 bookie 并行读取。

3.  消费者请求消息,broker 从 bookie 中拉取消息并转发给消费者

功能原理

1.  计算(Broker)与存储(Bookie)分离:

- broker:无状态的 proxy 服务,负责接收消息、传递消息、集群负载均衡等操作。

bookie:有状态,负责持久化存储消息

2.  故障隔离:Broker 崩溃不影响数据,Bookie 故障自动从其他副本重建恢复。

3.  弹性扩展:Broker 无需考虑数据迁移,可快速水平扩缩容;Bookie 存储层可按需独立扩展,新增 Bookie 后,数据自动重新分布。

MQ 系列对比

产品

Kafka

RocketMQ

Pulsar

产品特性

高并发、高吞吐、实时流处理平台

低延迟、高可靠、强一致

云原生、存算分离、跨地域复制

应用场景

对吞吐要求高的离线场景

对可靠性要求高的在线业务场景

兼容在线和离线请求

适用业务

网页活动追踪

日志分析、监控采集

流数据集成

电商在线支付、直播

证券交易

金融对账

跨云/跨地域数据同步

IoT 设备管理监控

Serverless 事件驱动

broker

存储数据,处理消息请求

存储数据,处理消息请求

无状态的服务,不存储数据,只负责消息的路由处理

数据存储单位

Partition

CommitLog(唯一物理存储文件,完全顺序写入)

Segment(颗粒更小,更利于存储负载均衡)

数据一致性

依赖 ISR 机制

同步刷盘 + 主从同步

BookKeeper 支持同步复制

扩展性

通过增加 Partition 数量,扩容 Broker 需要 rebalance

通过增加 Broker 组扩展 Queue 数量

Broker/Bookie 独立按需扩展计算/存储

故障切换

依赖 Controller 选举新 Leader

组内 Slave 接管 Master无需数据迁移立即接管

Broker 崩溃后,新节点无需数据迁移立即接管

Bookie 节点故障时,数据自动从其他副本重建

常见问题

为什么需要消息队列?

首先知道什么消息队列消息队列通过解耦生产消费者实现消息异步流量控制功能

那么什么生产者/消费者生产者通常是业务动作的发起者生产需要被传递或处理的业务数据可以是订单系统支付系统传感器设备消费者通常下游服务数据分析模块比如库存系统Spark 作业

为什么需要解耦生产者消费者消息队列产品的主要作用就是转储日志、监控数据等,举个例子就像丰巢快递柜,快递员若是不能把快递及时送到人员手上会造成快递拥堵,效率减慢;但是有丰巢柜来存储后就可以有一个地方暂存,消费者需要消费的时候再去拿快递,拉消息一样的道理。通过消息队列,业务系统可以做到故障隔离(生产者宕机不影响消费者)弹性扩展(应对流量波动),真正实现“高内聚、低耦合”的业务架构。

为什么叫消息队列为集群?

集群是一组节点的集合,节点可以是物理机或虚拟机。消息队列产品采用了分布式架构设计通过多节点协作实现高可用高性能扩展性具体参见上面架构设计

命名空间是做什么的?

命名空间多租户之间实现逻辑隔离。

首先要理解多租户的概念,多租户就是多个用户共享一个集群。消息队列产品通过命名空间角色权限配合实现权限管控从而实现不同命名空间逻辑隔离具体来讲就是用户角色配置某个命名空间读写权限一个命名空间里的所有 topic 都继承相同的设置则用户只对该命名空间内的 topic 操作权限可以参考下图帮助理解

如何理解 topic 这个概念?

学习消息队列产品过程中注意区分逻辑概念和物理概念 topic partition 都是业务逻辑概念实际上最后消息都是一个 segment 文件形式存储物理机器

topic 代表了消息的类别或主题,是生产消费的最小单位。从业务层面来讲,topic 就像是一个消息的分类标签,生产者将相关的消息发送到特定的 topic 中,而消费者则通过订阅感兴趣的 topic 来获取和处理这些消息。这种设计使得不同业务领域的消息能够自然地隔离,比如订单系统的消息可以发布到"order_topic",而支付系统的消息则流向"payment_topic",从而实现业务逻辑的清晰划分。

topic 的设计还体现了消息队列的关键特性——发布/订阅模式。生产者不需要知道有哪些消费者存在,只需关注将消息发送到正确的 topic;同样,消费者也只需订阅自己关心的 topic,无需感知消息的生产者是谁。这种松耦合的架构使得系统各组件能够独立演化,大大提升了整体架构的灵活性。此外,通过 topic 可以实现消息的多播,即一条消息可以被多个消费者组同时消费,这在需要将同一数据用于不同业务场景时显得尤为重要。

什么是数据落盘?

计算机存储内存缓存

消息队列接收到的数据写入磁盘持久化存储过程叫做落盘比如消息存储 kafka rocketmq broker 以及 pulsar bookie 磁盘这个过程

具体实现kafka 消息先写入 Page Cache(内存缓冲),再异步刷盘(可配置同步刷盘)RocketMQ 支持同步刷盘(每条消息立即写入磁盘)或异步刷盘(批量写入)

消息队列如何保证数据的一致性?

kafka 通过 ISR(In-Sync Replicas)机制来维护数据一致性。当生产者发送消息时,Leader 副本会先将消息写入本地日志,然后要求所有 ISR 中的 Follower 副本完成同步复制后,这条消息才会被确认为已提交。

RocketMQ 采用了双重保障机制来维护数据一致性。首先是同步刷盘策略,当 Broker 接收到消息后,可以选择立即将消息写入磁盘(同步刷盘)而非仅保留在内存中。其次是主从同步机制,每个主节点都会将消息同步到其从节点,只有当主从都成功写入后才会向生产者返回确认响应。

Pulsar 依赖 BookKeeper 作为底层存储引擎,每条消息都会被同步复制到多个 Bookie 节点,只有当大多数节点确认写入后,这条消息才会被标记为持久化成功。

参考链接

Apache Kafka

RocketMQ · 官方网站 | RocketMQ 消息队列

Apache Pulsar | Apache Pulsar

https://zhuanlan.zhihu.com/p/103249714

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

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

相关文章

ModernBERT如何突破BERT局限?情感分析全流程解析

自2018年推出以来,BERT 彻底改变了自然语言处理领域。它在情感分析、问答、语言推理等任务中表现优异。借助双向训练和基于Transformer的自注意力机制,BERT 开创了理解文本中单词关系的新范式。然而,尽管成绩斐然,BERT 仍存在局限…

股票Level2逐笔成交及十档订单簿分钟级Tick历史行情数据详细解析

本地股票数据处理与分析实战指南 在量化投资与金融数据分析领域,高效处理本地存储的股票数据是核心能力之一。本文将从数据类型定义、解析流程及实际应用角度,系统介绍如何基于CSV文件管理股票分钟数据、高频Tick数据、逐笔数据、Level2历史行情等多样化…

面向互联网2C业务的分布式类Manus Java框架

本文介绍了阿里巴巴推出的分布式类ManusAgent框架——ali-langengine-dflow,旨在解决现有Agent架构在互联网2C业务场景中的局限性。文章从背景出发,分析了当前主流Agent架构(如Manus、字节TARS、AutoGLM)存在的问题,如…

Java-82 深入浅出 MySQL 内部架构:服务层、存储引擎与文件系统全覆盖

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) AI炼丹日志-30-新发布【1T 万亿】参数量大模型!Kim…

开发避坑短篇(6):Vue+Element UI 深度选择器实现表单元素精准对齐的技术实践

需求 el-form 表单的el-input和el-select默认宽度度不一致&#xff0c;导致不对齐&#xff0c;如下图。那么如何设置让el-input和el-select的宽度度一致并对齐&#xff1f;<el-form class"page-form" :model"addForm" :rules"rules" :disable…

rust-参考与借用

参考与借用 在清单4-5中的元组代码的问题在于&#xff0c;我们必须将String返回给调用函数&#xff0c;这样我们才能在调用calculate_length之后继续使用String&#xff0c;因为String已经被移动到了calculate_length中。相反&#xff0c;我们可以提供一个对String值的引用。引…

深入解析HDFS Federation:如何有效解决单NameNode瓶颈问题

HDFS Federation简介与背景在Hadoop分布式文件系统&#xff08;HDFS&#xff09;的经典架构中&#xff0c;NameNode作为核心组件承担着整个文件系统的元数据管理职责。这一设计虽然简洁高效&#xff0c;但随着数据规模的爆炸式增长&#xff0c;单NameNode架构逐渐暴露出难以克服…

为什么选择EasyGBS?

作为集 算法仓、算力设备接入、视频云平台 于一体的综合性智能安防监控平台&#xff0c;EasyGBS有哪些优势是您的必选理由呢&#xff1f;一、设备与协议的兼容性EasyGBS不挑设备品牌型号。只要支持GB28181、RTSP、ONVIF、RTMP标准协议里的任一种&#xff0c;就能将视频接入。但…

【形态学变换】——图像预处理(OpenCV)

目录 1 核 2 腐蚀 3 膨胀 4 开运算 5 闭运算 6 礼帽运算 7 黑帽运算 8 形态学梯度 形态学变换是一种基于形状的简单变换&#xff0c;处理对象是二值化后的图像。有两个输入&#xff1a;原图像和核&#xff0c;一个输出&#xff1a;形态学变换后的图像。基本操作有以下四…

一次“非法指令”(SIGILL)问题的完整调试过程:CPU指令集兼容性探秘

一次"非法指令"问题的完整调试过程&#xff1a;CPU指令集兼容性探秘一、问题概述二、问题现象与初步分析1. 环境与现象2. 官方文档的线索3. 重现问题4. 怀疑方向&#xff1a;CPU指令兼容性5. 关键发现&#xff1a;AVX512指令三、详细调试过程1. 搭建调试环境 (KVM虚拟…

Node.js - 创建 Express 项目

创建 Express 项目 安装 npm i -g express-generatorornpm i -g express-generator4# 注意&#xff1a;Windows有可能碰到提示&#xff1a;npm : 无法加载文件 C:\Program Files\nodejs\npm.ps1&#xff0c;因为在此系统上禁止运行脚本。 # 如果碰到这个错误&#xff0c;需要…

高并发系统设计面试题

高并发系统设计面试题&#x1f525;&#x1f525;&#x1f525; 超高频问题&#xff08;几乎必问&#xff09;让你设计一个秒杀系统&#xff0c;你会考虑哪些问题&#xff1f;如果你的业务量突然提升100倍QPS你会怎么做&#xff1f;库存扣减如何避免超卖和少卖&#xff1f;订单…

【通识】如何看电路图

1. 电路图 1.1 基础概念 电路图即电原理图。 电路图第一种是说明模拟电子电路工作原理&#xff0c;用图形符号表示电阻器、电容器、开关、晶体管等实物&#xff0c;用线条把元器件和单元电路按工作原理的关系连接起来。 第二种则是说明数字电子电路工作原理的。用图形符号表示…

SpringBoot实战指南:从快速入门到生产级部署(2025最新版)

一、为什么SpringBoot依然是Java开发的首选&#xff1f; SpringBoot自2014年发布以来&#xff0c;已成为Java企业级开发的事实标准框架。根据2025年最新调研数据显示&#xff0c;全球78%的Java微服务项目基于SpringBoot构建&#xff0c;其核心优势在于&#xff1a; 约定优于配置…

新房装修是中央空调还是壁挂空调好?

这个要看户型和投资金额&#xff0c;大户型空间适合装中央空调&#xff0c;因为空间大有足够的地方安装&#xff0c;功率也可以根据面积大小进行配置&#xff0c;整体配置一个外机就行了&#xff0c;整体的装修效果比较规整&#xff0c;就是多花点&#xff0c;使用成本也稍高点…

如何理解泊松分布

文章目录一、引例——鲸鱼研究二、泊松分布一、引例——鲸鱼研究 有生态学家对生活在北冰洋水域的鲸鱼进行了跟踪研究&#xff0c;他们利用一台水下无人机来探测鲸鱼数量&#xff0c;这是近十天的数据&#xff1a; 第1天第2天第3天第4天第5天第6天第7天第8天第9天第10天10101…

python学习DAY22打卡

作业&#xff1a; 自行学习参考如何使用kaggle平台&#xff0c;写下使用注意点&#xff0c;并对下述比赛提交代码 kaggle泰坦尼克号人员生还预测 import warnings warnings.filterwarnings("ignore") #忽略警告信息 # 数据处理清洗包 import pandas as pd import …

在 Ansys CFX Pre 中配置 RGP 表的分步指南

掌握在 Ansys CFX Pre 中设置 RGP 表的技巧&#xff0c;以优化仿真精度和效率。挑战在计算流体动力学 &#xff08;CFD&#xff09; 领域&#xff0c;RGP&#xff08;真实气体属性&#xff09;表对于准确模拟流体在不同条件下的行为至关重要。这些表格提供了详细的热力学属性&a…

C语言————原码 补码 反码 (日渐清晰版)

本文的内容通下面这篇文章有着紧密的联系&#xff0c;读者可以选择性阅读 C语言————二、八、十、十六进制的相互转换-CSDN博客 目录 基本概念 原码 反码 补码 转换 数据的存储方式 基本存储单位 数据的计算方式 补码的模运算原理 移位操作符 左移操作符 右移操…

函数-变量的作用域和生命周期

变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&#xff0c;但我们并没有考虑函数是否需要提供参数&#xff0c;如果说函数可以访问到已定义…