MQ-消息队列

定义        

        Mssage Queue:消息队列。它是一种“先进先出”(FIFO)的数据结构,用于在分布式系统或应用程序之间进行异步通信。

组成

1. 生产者(Producer)
  • 定义:消息的发送方,负责将业务系统产生的消息(如订单创建、日志数据)按照指定格式封装后,发送到 MQ 的 “交换机 / 主题” 等入口组件。
  • 核心能力
    • 支持同步 / 异步发送(同步需等待确认,异步提高吞吐量);
    • 消息序列化(如 JSON、Protobuf),确保跨系统可解析;
    • 重试机制(发送失败时自动重试,避免消息丢失)。
2. 消费者(Consumer)
  • 定义:消息的接收方,负责从 MQ 的 “队列” 中拉取或接收消息,并执行后续业务逻辑(如订单支付回调处理、日志存储)。
  • 核心能力
    • 消费模式:分为 拉取模式(Pull)(消费者主动向 MQ 请求消息)和 推送模式(Push)(MQ 主动将消息推送给消费者);
    • 消费确认(Ack):处理完消息后向 MQ 发送确认信号,MQ 收到后才删除消息,避免重复消费;
    • 消费组(Consumer Group):多个消费者组成一个组,共同消费一个 “主题 / 队列” 的消息(实现负载均衡,提高消费效率)。
3. 消息(Message)
  • 定义:MQ 传递的数据载体,是生产者与消费者之间的 “通信内容”。
  • 核心结构
    • 消息体(Body):实际业务数据(如 “订单 ID=123,金额 = 100”);
    • 消息头(Header):元数据,用于 MQ 路由和控制,常见字段包括:
      • 消息 ID(唯一标识,用于去重和追踪);
      • 主题 / 路由键(用于确定消息投递到哪个队列);
      • 过期时间(TTL,超过时间未消费则丢弃 / 进入死信队列);
      • 优先级(高优先级消息优先投递,部分 MQ 支持)。
4. 交换机 / 主题(Exchange/Topic)
  • 定义:消息的 “路由中枢”,接收生产者发送的消息,并根据预设的 “路由规则”,将消息分发到对应的队列中。不同 MQ 对这一组件的命名和实现略有差异:
    • RabbitMQ:明确使用 “交换机(Exchange)”,支持 4 种路由类型(Direct 精确匹配、Topic 模糊匹配、Fanout 广播、Headers 头匹配);
    • Kafka/RocketMQ:使用 “主题(Topic)”,主题下细分 “分区(Partition)”,消息按分区规则(如哈希、轮询)分发到不同分区,本质是简化的路由逻辑。
5. 队列(Queue/Partition)
  • 定义:消息的 “存储容器”,接收交换机 / 主题分发的消息,并暂存消息,等待消费者拉取或接收。不同 MQ 的队列设计差异较大:
    • RabbitMQ:队列是独立的存储单元,支持 “持久化”(重启后不丢失消息)、“独占”(仅一个消费者访问)、“自动删除”(无消费者时自动删除);
    • Kafka/RocketMQ:队列以 “分区(Partition)” 形式存在,一个主题下有多个分区,分区内消息按 “偏移量(Offset)” 有序存储,支持分布式存储和并行消费(每个分区可被一个消费者消费)。
6. Broker 节点
  • 定义:MQ 的 “服务实例”,是上述所有组件(交换机、队列、消息存储)的物理载体,负责接收生产者消息、存储消息、向消费者投递消息。
  • 部署模式
    • 单机模式:仅一个 Broker 节点,用于测试;
    • 集群模式:多个 Broker 节点组成集群,实现负载均衡和高可用(如 Kafka 集群通过 “副本(Replica)” 机制保证分区数据的冗余,RocketMQ 通过 “主从架构” 实现故障转移)。
7. 消息存储(Message Storage)
  • 定义:负责持久化存储消息,避免消息因 Broker 重启或故障丢失。不同 MQ 的存储方案差异显著:
    • Kafka:基于 “磁盘日志文件” 存储,消息按分区写入日志文件,通过 “页缓存(Page Cache)” 和 “顺序写入” 优化性能,支持长时间存储(可配置保留期);
    • RocketMQ:使用 “混合存储”(内存 + 磁盘),消息先写入内存 “CommitLog”,再异步刷盘持久化,兼顾性能和可靠性;
    • RabbitMQ:默认将消息存储在内存(非持久化消息),持久化消息存储在磁盘的 “Mnesia 数据库” 中,适合短时间暂存消息。
8. 消息确认机制(Ack Mechanism)
  • 定义:确保消息 “不丢失、不重复、不遗漏” 的核心保障,分为三个阶段:
    1. 生产者确认(Producer Ack):MQ 接收消息并持久化后,向生产者返回确认信号(如 Kafka 的 ACK 机制,支持 0 不确认、1 主分区确认、-1 所有副本确认);
    2. 消费者确认(Consumer Ack):消费者处理完消息后,向 MQ 返回确认信号,MQ 收到后删除消息(若消费者崩溃未确认,MQ 会将消息重新投递给其他消费者,避免丢失);
    3. Broker 内部确认:集群模式下,主节点接收消息后,同步给从节点 / 副本,确认同步完成后才认为消息持久化成功(如 RocketMQ 的主从同步、Kafka 的副本 ISR 机制)。
9. 死信队列(Dead-Letter Queue, DLQ)
  • 定义:“异常消息的垃圾桶”,用于存储无法正常消费的消息(如消费者多次处理失败、消息过期、队列满),避免异常消息阻塞正常消费流程。
  • 作用:开发人员可后续分析死信队列中的消息,定位业务问题(如数据格式错误、业务逻辑异常),并支持 “死信重投”(将死信消息重新发送到正常队列,重试处理)。

分类

        常用的:Kafka、ActiveMQ、RabbitMQ、RocketMQ等

特性Apache KafkaRabbitMQApache RocketMQActiveMQ
核心定位高吞吐量的分布式发布-订阅消息系统,流处理平台通用性强的消息代理,实现了高级消息队列协议(AMQP)低延迟/高吞吐的分布式消息和流处理平台成熟的面向消息的中间件(MOM),支持多种协议
语言/社区Scala/Java,Apache 顶级项目,非常活跃Erlang,非常活跃Java,Apache 顶级项目,非常活跃(尤其在中国)Java,Apache 项目,ActiveMQ 5.x 经典版较慢,ActiveMQ Artemis 较新
吞吐量极高(百万级/秒),吞吐量为首要设计目标中等(万级/秒)极高(十万级/秒),与 Kafka 媲美一般(万级/秒),Artemis 版本有显著提升
延迟毫秒级(非严格实时)微秒级(极低)毫秒级(低)毫秒级
消息可靠性非常高(通过副本机制保证)非常高(通过确认、持久化、镜像队列保证)非常高(刷盘、同步复制)高(支持持久化)
功能特性- 顺序读写、高吞吐
- 持久化、多副本
- 丰富的流处理生态(Kafka Streams, Connect)
- 消息确认、持久化、优先级
- 灵活的路由(Exchange)
- 死信队列、延迟队列(插件)
- 顺序消息、事务消息
- 消息回溯、定时/延迟消息
- 消息轨迹、审计
- 支持多种协议(OpenWire, STOMP, AMQP, MQTT)
- 主从架构、消息组
优点1. 吞吐量巨大,性能卓越
2. 持久化能力强,适合海量数据
3. 分布式、扩展性极佳
4. 生态丰富,流处理支持好
1. 成熟稳定,社区活跃
2. 管理界面友好,易于监控
3. 协议支持丰富,灵活路由
4. 延迟极低,适合实时消息
1. 高吞吐、低延迟
2. 功能全面(顺序/事务/延迟消息)
3. 金融级数据可靠性
4. 阿里背书,久经考验
1. 支持协议最多,集成方便
2. 与 JMS 规范完美集成
3. 部署简单,易于上手
缺点1. 功能较单一(主要是Pub/Sub)
2. 监控和管理工具相对复杂
3. 可能会消息重复(At least once)
1. Erlang 语言,二次开发难度大
2. 吞吐量有瓶颈,不如 Kafka/RocketMQ
3. 集群动态扩展稍麻烦
1. 社区国际化程度不如 Kafka
2. 客户端语言支持主要为 Java
3. 文档和最佳实践相对较少(英文)
1. 经典版性能一般,吞吐量较低
2. 社区活跃度下降(转向Artemis)
3. 不适合超大规模场景
主要协议自定义协议(基于TCP)AMQP 0-9-1(核心),STOMP, MQTT自定义协议(基于TCP),JMSOpenWire(默认),AMQP, STOMP, MQTT, JMS
持久化磁盘顺序追加日志内存、磁盘(支持消息和队列索引)磁盘高速读写支持(KahaDB, JDBC, LevelDB等)
适用场景- 日志收集、流式数据处理
- 用户活动跟踪(点击流)
- 监控Metrics聚合
- 事件溯源
- 企业级应用集成(EAI)
- 异步任务处理(后台作业)
- 订单处理、通知
- 需要复杂路由规则的场景
- 金融交易(如订单、支付)
- 电商峰值削谷(如秒杀)
- 大数据分析管道
- 需要严格顺序和事务的场景
- 传统的企业级JMS应用
- 需要支持多种协议(如MQTT用于IoT)
- 中小规模的消息代理

大数据用 Kafka,通用集成用 RabbitMQ,金融电商等高要求场景用 RocketMQ,传统 JMS 或多协议需求考虑 ActiveMQ/Artemis。

消息可靠性

如何保证消息的可靠性?

  1. 生产者端:

    • 使用 异步Confirm机制(或事务消息)。

    • 处理Broker返回的NACK和超时情况,并实现重发逻辑。

    • (可选)在本地缓存已发送未确认的消息,用于故障恢复。

  2. Broker端:

    • 设置消息和队列为持久化。

    • 配置至少2个以上副本的同步复制(如Kafka的min.insync.replicas > 1acks=all,RabbitMQ的镜像队列同步模式)。

  3. 消费者端:

    • 关闭自动确认,开启手动确认。

    • 确保业务逻辑处理成功后再发送ACK。

    • 实现消费幂等性,以应对重复消息。

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

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

相关文章

NVIDIA驱动程序核心的“即时编译器”(Just-in-Time, JIT Compiler)详细介绍

我们来详细、深入地剖析这个位于NVIDIA驱动程序核心的“即时编译器”(Just-in-Time, JIT Compiler)。它堪称CUDA生态系统成功的“幕后英雄”,是连接软件稳定性和硬件飞速发展的关键桥梁。 第一部分:JIT编译器的本质 首先&#xff…

【PS2025全网最新版】稳定版PS2025保姆级下载安装详细图文教程(附安装包)(Adobe Photoshop)

今天,给大家带来PS2025的保姆级下载安装图文教程。 前言: Adobe Photoshop 作为业界领先的图像处理与设计软件,持续推动着数字创意领域的发展。其应用涵盖平面设计、摄影后期、UI/UX 设计、影视特效等多个专业方向,为用户提供强…

分享TWS充电仓方案开发设计

TWS耳机市场“卷”到最后,拼的早已不只是音质,而是续航、交互、体积、成本四位一体。传统充电仓用多颗IC堆砌:升压、电量计、霍尔、LED驱动、保护IC……BOM高、贴片复杂、调试周期长。8位MCU把上述功能“一锅端”:单芯片即完成电源…

【Java实战㉖】深入Java单元测试:JUnit 5实战指南

目录一、单元测试概述1.1 单元测试概念1.2 单元测试优势1.3 JUnit 5 框架组成1.4 JUnit 5 环境搭建二、JUnit 5 核心功能实战2.1 测试类与测试方法2.2 测试生命周期2.3 断言方法2.4 异常测试三、单元测试进阶实战3.1 参数化测试3.2 测试套件3.3 Mockito 框架3.4 单元测试实战案…

分布式微服务--ZooKeeper作为分布式锁

看这篇博客之前可以先去了解博主的另一篇讲解ZooKeeper的博客:分布式微服务--ZooKeeper的客户端常用命令 & Java API 操作-CSDN博客 1. 为什么需要分布式锁? 在分布式系统中,多个服务节点可能同时访问或修改同一份共享资源(例…

基于容器化云原生的 MySQL 及中间件高可用自动化集群项目

1 项目概述 本项目旨在构建一个高可用、高性能的 MySQL 集群,能够处理大规模并发业务。通过容器化部署、多级缓存、完善的监控和备份策略,确保数据库服务的连续性和数据安全性。 架构总览 预期目标 数据库服务可用性达到 99.99% 支持每秒 thousands 级别的并发访问 实现秒…

如何将 iPhone 备份到电脑/PC 的前 5 种方法

定期备份你的 iPhone(最好每两周一次)对于保护你的数据至关重要。它确保了如果设备损坏、丢失或被盗,或者你换了新手机,你不会丢失重要信息,并且可以轻松地从备份中恢复应用程序、照片、设置等。如果你不确定如何备份 …

国产AI芯片编程模型深度对比:寒武纪MLU vs 壁仞BR100异构计算设计

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 引言:国产AI芯片的崛起与挑战 随着人工智能技术的飞速…

【项目】基于One Thread One Loop模型的高性能网络库实现 - 项目介绍与前置知识

目录 项目介绍 HTTP服务器基本认识 Reactor模式基本认识 单Reactor单线程模式认识 单Reactor多线程模式认识 多Reactor多线程模式认识 模块划分 Server模块 Buffer模块 Socket模块 Channel模块 Connection模块 Acceptor模块 TimerQueue模块 Poller模块 EventLo…

lua中table键类型及lua中table的初始化有几种方式

在 Lua 中,table 的键几乎可以是任何类型,但有几个重要的规则和最佳实践需要了解。1. 主要键类型(1) 字符串 (string)这是最常见、最推荐的键类型。local person {name "Alice", -- 等同于 ["name"] "Alice"["age…

matlab实现利用双MZI产生RZ33-QPSK信号

利用MATLAB实现双MZI产生RZ33-QPSK信号的代码: 参数设置 % 信号参数 fs 1e6; % 采样频率 fc 10e6; % 载波频率 T 1e-6; % 符号周期 N 1000; % 采样点数 t 0:1/fs:(N-1)/fs; % 时间向量生成QPSK信号 % 生成随机二进制序列 data randi([0,1],1,N);% 将二进制序列…

Vue响应式更新 vs React状态更新:两种范式的底层逻辑与实践差异

在现代前端框架中,Vue和React作为两大主流选择,分别采用了截然不同的状态管理与更新机制。Vue的“响应式更新”通过自动追踪依赖实现数据与视图的联动,而React的“状态更新”则依赖显式setState触发重新渲染。本文将从底层原理、更新流程、优…

Spring MVC 的常用注解

一、控制器相关注解ControllerController注解用于标记一个类为 Spring MVC 的控制器。在 Spring MVC 框架里,控制器扮演着关键角色,负责接收 HTTP 请求并返回响应。当一个类被Controller注解标记后,Spring 容器会自动识别并将其纳入管理。例如…

Oracle APEX 利用卡片实现翻转(方法一)

目录 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 1. 创建PL/SQL动态内容区域 2. 添加 CSS 实现翻转效果 3. 添加动态操作 (Dynamic Action) 4. 看效果 0. 以 Oracle 的标准示例表 EMP 为例,实现卡片翻转 正面: 显示员工姓名 (EN…

Gradio全解11——Streaming:流式传输的视频应用(1)——FastRTC:Python实时通信库

Gradio全解11——Streaming:流式传输的视频应用(1)——FastRTC:Python实时通信库前言第11章 Streaming:流式传输的视频应用11.1 FastRTC:Python实时通信库11.1.1 WebRTC协议与FastRTC介绍1. WebRTC协议的概…

一文学会二叉搜索树,AVL树,红黑树

文章目录二叉搜索树查找插入删除AVL树概念插入旋转AVL验证红黑树概念插入检测二叉搜索树 也称二叉排序树或二叉查找树 二叉搜索树:可以为空,若不为空满足以下性质 ⭐1,非空左子树小于根节点的值 ⭐2,非空右子大于根节点的值 ⭐3…

Android实战进阶 - 启动页

场景:当启动页处于倒计时阶段,用户将其切换为后台的多任务卡片状态,倒计时会继续执行,直到最后执行相关逻辑(一般会跳转引导页、进入主页等) 期望:而综合市场来看,一般我们期望的是当…

无标记点动捕技术:重塑展厅展馆的沉浸式数字交互新时代

在元宇宙浪潮的持续推进下,虚拟数字人正逐渐成为连接虚实世界的重要媒介。在展厅展馆中,数字人不仅能够扮演导览员、讲解员角色,更可通过情感化交互提升参观体验,使文化传播更具感染力和沉浸感。虚拟人的引入,为传统展…

轻松Linux-7.Ext系列文件系统

天朗气清,惠风和煦,今日无事,遂来更新。 1.概述 总所周知,我们存的数据都是在一个叫硬盘的东西里面,这个硬盘又像个黑盒,这章就来简单解析一下Linux中文件系统。 现在我们用的大都是固态硬盘,…

Matlab机器人工具箱使用4 蒙特卡洛法绘制工作区间

原理:利用rand随机数,给各个关节设置随机关节变量,通过正运动学得到末端位姿变换矩阵,然后利用变换矩阵2三维坐标标记出末端坐标,迭代多次就可以构成点云。教程视频:【MATLAB机器人工具箱10.4 机械臂仿真教…