1. 消息队列概述

1.1 核心概念

消息队列(Message Queue,MQ)是一种基于生产者-消费者模型的异步通信中间件。它通过一个先进先出(FIFO)的缓冲区,将消息的发送方(生产者)与接收方(消费者)解耦,使双方无需直接交互即可完成数据交换。

核心术语:
  • 生产者(Producer):发送消息的应用程序或服务。
  • 消费者(Consumer):接收并处理消息的应用程序或服务。
  • 队列(Queue):消息的临时存储容器,保证消息有序到达。
  • 主题(Topic):消息的逻辑分类,支持发布/订阅模式。
  • 消息(Message):传输的数据单元,通常包含业务负载和元数据。
  • 确认机制(ACK):消费者处理完成后向队列发送的确认信号,确保消息不丢失。
消息队列核心架构 生产者 Producer 消息队列 Message Queue • 队列(Queue) • 主题(Topic) • 消息存储 • ACK确认 消费者 Consumer 发送消息 消费消息 ACK确认

1.2 三大核心应用场景

场景 问题描述 MQ 解决方案 典型收益
解耦 服务间直接调用,一方变更导致连锁修改 生产者只向队列发送消息,消费者独立订阅处理 服务独立演进,减少依赖
异步 同步调用导致请求响应时间过长 生产者发送后立即返回,消费者后台处理 降低延迟,提升吞吐量
削峰 突发流量压垮后端服务 消息暂存队列,消费者按能力拉取处理 保护系统,平滑流量
实战案例: 电商订单系统中,用户下单后,MQ 将订单消息分发给库存、支付、物流等子系统。即使物流服务暂时不可用,订单也能正常创建,消息在队列中等待恢复后继续处理。

1.3 主流消息队列对比

当前业界最常用的消息队列产品包括 RabbitMQ、Kafka 和 RocketMQ。三者在设计理念、性能特征和适用场景上存在显著差异。

特性 RabbitMQ Kafka RocketMQ
开发语言 Erlang Scala/Java Java
协议支持 AMQP 0-9-1, MQTT, STOMP 自定义 TCP 协议 自定义 TCP 协议
消息模型 队列 + 交换机(Exchange) 主题分区(Topic + Partition) 主题队列(Topic + Queue)
吞吐量 万级/秒 百万级/秒 十万级/秒
消息可靠性 高(支持确认、持久化、镜像队列) 高(副本机制、ISR) 高(同步刷盘、同步复制)
顺序消息 单队列有序 分区内有序 队列内有序
延迟消息 支持(插件) 不支持原生 支持(18个等级)
运维复杂度 中等 较高 中等
典型场景 微服务解耦、任务队列 日志收集、流处理、大数据 交易消息、金融场景
主流消息队列选型对比 RabbitMQ 语言:Erlang 吞吐:万级/秒 协议:AMQP/MQTT 模型:交换机+队列 延迟消息:✅ 插件 顺序消息:单队列 运维:中等 微服务解耦 / 任务队列 Kafka 语言:Scala/Java 吞吐:百万级/秒 协议:自定义TCP 模型:Topic+Partition 延迟消息:❌ 不支持 顺序消息:分区内 运维:较高 日志收集 / 流处理 / 大数据 RocketMQ 语言:Java 吞吐:十万级/秒 协议:自定义TCP 模型:Topic+Queue 延迟消息:✅ 18级 顺序消息:队列内 运维:中等 交易消息 / 金融场景 选型建议:高吞吐选 Kafka,高可靠选 RocketMQ,灵活路由选 RabbitMQ
选型避坑:
  • 不要用 RabbitMQ 处理海量日志流(吞吐瓶颈明显)。
  • 不要用 Kafka 做金融级交易消息(原生不支持延迟消息,顺序消息需额外设计)。
  • 不要用 RocketMQ 做 IoT 设备消息(协议较重,建议 MQTT)。

1.4 本章小结