Skip to main content
消息队列(Message Queue,MQ)是分布式系统中实现异步通信、系统解耦、流量削峰的核心中间件。

目录

为什么需要消息队列

1. 异步处理

同步处理:
用户注册 → 写数据库(50ms) → 发邮件(50ms) → 发短信(50ms) → 响应(150ms)

异步处理(使用 MQ):
用户注册 → 写数据库(50ms) → 发送消息到MQ → 响应(50ms)

                    消费者异步发邮件、发短信

2. 系统解耦

耦合方式:
订单系统 → 直接调用库存系统
         → 直接调用支付系统
         → 直接调用物流系统

解耦方式(使用 MQ):
订单系统 → 发送消息到 MQ

    库存系统、支付系统、物流系统 订阅消息

3. 流量削峰

高峰期:10000 请求/秒

      消息队列(缓冲)

后端系统:按能力消费(1000/秒)

RabbitMQ vs Kafka vs RocketMQ 对比

基本信息

特性RabbitMQKafkaRocketMQ
开发语言ErlangScala/JavaJava
开源协议MPL 2.0Apache 2.0Apache 2.0
维护方VMwareApache/ConfluentApache/阿里巴巴
协议支持AMQP、STOMP、MQTT自定义协议自定义协议

架构设计

特性RabbitMQKafkaRocketMQ
架构模型Broker 中心化分布式日志分布式消息
元数据管理内置/外部存储ZooKeeper/KRaftNameServer
消息存储内存 + 磁盘磁盘顺序写磁盘顺序写
消息模型Exchange → QueueTopic → PartitionTopic → Queue
消费模式PushPullPush/Pull

性能对比

指标RabbitMQKafkaRocketMQ
单机吞吐量万级百万级十万级
消息延迟微秒级毫秒级毫秒级
Topic 数量影响大(慎用过多)
消息堆积能力一般

功能特性

功能RabbitMQKafkaRocketMQ
顺序消息✅ 单队列✅ 分区内有序✅ 分区内有序
延迟消息✅ 插件支持❌ 不支持✅ 原生支持
事务消息✅ 支持✅ 0.11+ 支持✅ 原生支持
消息回溯❌ 不支持✅ 按 offset✅ 按时间/offset
消息过滤✅ 路由键❌ 需客户端实现✅ Tag/SQL92
死信队列✅ 支持❌ 需自行实现✅ 支持
消息轨迹✅ 插件支持❌ 需自行实现✅ 原生支持
消息优先级✅ 支持❌ 不支持❌ 不支持

可靠性保障

特性RabbitMQKafkaRocketMQ
消息持久化
消息确认ACK 机制Offset 提交ACK 机制
数据副本镜像队列/QuorumISR 副本机制主从复制/Dledger
自动故障转移✅ 需配置✅ 自动✅ Dledger 模式

适用场景

MQ适用场景不适用场景
RabbitMQ低延迟、复杂路由、企业集成、中小规模超大规模日志、超高吞吐
Kafka日志收集、大数据处理、流计算、事件溯源复杂消息特性、延迟消息
RocketMQ电商/金融、分布式事务、订单系统、延迟消息超低延迟(微秒级)、纯日志收集

选型建议

需要低延迟 + 复杂路由 → RabbitMQ
需要超高吞吐 + 大数据 → Kafka
需要业务消息 + 事务支持 → RocketMQ
优先选择场景描述
RabbitMQ对延迟敏感、需要灵活路由、团队熟悉 AMQP
Kafka日志收集、实时数仓、流计算平台
RocketMQ电商交易、金融业务、需要事务/延迟消息

核心概念

Producer(生产者)

消息的发送方,负责创建和发送消息。

Consumer(消费者)

消息的接收方,负责接收和处理消息。

Broker(代理/服务器)

消息队列服务端,负责存储和转发消息。

Topic(主题)

消息的分类,生产者发送消息到指定 Topic,消费者订阅 Topic 获取消息。

Queue(队列)

消息的存储容器,消息按顺序存入队列。

Message(消息)

传输的数据单元,包含消息头和消息体。

消息模式

点对点模式(P2P)

Producer → Queue → Consumer
一条消息只能被一个消费者消费。

发布订阅模式(Pub/Sub)

Producer → Topic → Consumer1
                 → Consumer2
                 → Consumer3
一条消息可以被多个消费者消费。