核心概念

RabbitMQ 是基于 AMQP(Advanced Message Queuing Protocol)协议实现的消息中间件,采用 生产者-交换器-队列-消费者 的架构模型,通过解耦组件实现异步通信和削峰填谷。

架构组件详解

1. 核心组件

Producer → Exchange → Binding → Queue → Consumer
            ↓
        Virtual Host (隔离)
            ↓
        Connection → Channel (多路复用)

关键组件说明

  • Producer(生产者):发送消息的应用程序
  • Exchange(交换器):接收消息并根据路由规则分发到队列
  • Queue(队列):存储消息,等待消费者消费
  • Binding(绑定):Exchange 和 Queue 之间的路由规则
  • Consumer(消费者):接收并处理消息的应用程序
  • Virtual Host(虚拟主机):逻辑隔离单元,相当于命名空间
  • Connection(连接):TCP 长连接
  • Channel(信道):在 Connection 内的虚拟连接,复用 TCP 连接

2. 消息流转过程

// 1. 生产者发送消息到 Exchange
channel.basicPublish(
    "exchange_name",    // 交换器名称
    "routing_key",      // 路由键
    MessageProperties.PERSISTENT_TEXT_PLAIN,
    message.getBytes()
);

// 2. Exchange 根据类型和路由键决定分发到哪个队列
// 3. Queue 存储消息
// 4. Consumer 从队列拉取或推送消息
channel.basicConsume(queueName, autoAck, consumer);

3. Broker 内部结构

RabbitMQ Broker
├── Virtual Host (/)
│   ├── Exchange (交换器)
│   │   ├── direct
│   │   ├── fanout
│   │   ├── topic
│   │   └── headers
│   ├── Queue (队列)
│   │   ├── 消息存储
│   │   └── 消费者绑定
│   └── Binding (绑定关系)
└── 权限控制

关键原理

1. Channel 多路复用

  • 每个 Connection 是一个 TCP 连接(开销大)
  • 多个 Channel 共享一个 Connection(轻量级)
  • 线程隔离:每个线程使用独立的 Channel
Connection connection = factory.newConnection();
Channel channel = connection.createChannel(); // 创建信道

2. Virtual Host 隔离

  • 不同业务使用不同的 vhost
  • 相互隔离的 Exchange、Queue、Binding
  • 独立的权限控制

3. 消息确认机制

  • 生产者确认:Confirm 模式确保消息到达 Exchange
  • 消费者确认:ACK 机制确保消息被正确处理
  • 持久化:Exchange、Queue、Message 可设置持久化

性能与高可用考量

1. 性能优化

  • 批量发送:减少网络开销
  • 异步发送:使用 Confirm 异步模式
  • 预取数量channel.basicQos(prefetchCount) 控制消费速率
  • 惰性队列:消息直接存盘,降低内存压力

2. 高可用方案

普通集群(元数据共享)
├── 队列数据在单节点
└── 消费时可能需要转发

镜像队列(主从同步)
├── 队列数据在多节点
└── 自动故障转移

仲裁队列(Quorum Queue,推荐)
├── 基于 Raft 协议
└── 更强的一致性保证

3. 集群架构

Load Balancer
    ↓
RabbitMQ Cluster
├── Node1 (Master)
├── Node2 (Mirror)
└── Node3 (Mirror)

面试总结

核心架构:Producer → Exchange → Queue → Consumer,通过 Channel 多路复用 TCP 连接,Virtual Host 实现逻辑隔离。

关键特性

  1. Exchange 支持多种路由模式(direct/fanout/topic/headers)
  2. 双重确认机制(生产者 Confirm + 消费者 ACK)
  3. 支持集群和镜像队列实现高可用

应用场景

  • 异步解耦(订单系统与库存系统)
  • 流量削峰(秒杀场景)
  • 延迟队列(定时任务)
  • RPC 调用(通过 replyTo 实现)

常见问题

  • 消息丢失 → 开启持久化 + 确认机制
  • 消息重复 → 消费端幂等性处理
  • 消息堆积 → 增加消费者 + 调整预取数量