文章中如果有图看不到,可以点这里去 csdn 看看。从那边导过来的,文章太多,没法一篇篇修改好。

四、RabbitMQ精讲:灵活的路由与AMQP协议模型

一、RabbitMQ 简介

RabbitMQ 是基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 实现的消息中间件,最早由金融领域推动。它的核心特点是:

  • 协议标准化:严格遵循 AMQP 协议,跨语言、跨平台。
  • 灵活的消息路由:通过 Exchange(交换机)+ RoutingKey 实现复杂消息分发。
  • 多租户支持:通过 vhost(虚拟主机)实现隔离。
  • 高可靠性:持久化、ACK、镜像队列、集群机制。

典型应用场景

  • 订单业务消息分发(不同类型订单分发到不同系统)。
  • 日志/监控系统(日志广播到多个消费者)。
  • 延迟任务(超时未支付订单取消)。
  • 金融、支付系统(要求高可靠性的场景)。

二、RabbitMQ 核心架构与 AMQP 模型

RabbitMQ 遵循 AMQP 协议,定义了五个核心概念:

  1. Connection / Channel

    • Connection 是 TCP 连接,Channel 是虚拟通道,应用通过 Channel 与 Broker 交互。
  2. Exchange(交换机)

    • 负责消息路由,支持 Direct、Fanout、Topic、Headers 四种模式。
  3. Queue(队列)

    • 存储消息,消费者从队列中获取。
  4. Binding(绑定)

    • 定义 Exchange 和 Queue 之间的路由规则。
  5. Message(消息)

    • 包含消息体和属性(如 headers、priority、expiration)。

AMQP 模型结构图(Mermaid)

RoutingKey=info
RoutingKey=error
Producer
Exchange
Queue A
Queue B
Consumer1
Consumer2

三、SpringBoot 集成 RabbitMQ

1. 依赖引入

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 配置文件

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    virtual-host: /

3. 配置类(Direct 模式示例)

@Configuration
public class RabbitConfig {

    public static final String QUEUE_NAME = "direct.queue";
    public static final String EXCHANGE_NAME = "direct.exchange";

    @Bean
    public Queue queue() {
        return new Queue(QUEUE_NAME, true);
    }

    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(EXCHANGE_NAME, true, false);
    }

    @Bean
    public Binding binding(Queue queue, DirectExchange exchange) {
        return BindingBuilder.bind(queue).to(exchange).with("routing.key");
    }
}

4. 生产者

@RestController
@RequestMapping("/rabbit")
public class RabbitProducer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/send")
    public String send(@RequestParam String msg) {
        rabbitTemplate.convertAndSend(
            RabbitConfig.EXCHANGE_NAME,
            "routing.key",
            msg
        );
        return "已发送: " + msg;
    }
}

5. 消费者

@Component
public class RabbitConsumer {

    @RabbitListener(queues = RabbitConfig.QUEUE_NAME)
    public void receive(String message) {
        System.out.println("收到消息: " + message);
    }
}

四、RabbitMQ 的核心特性

1. Exchange 类型

  • Direct(直连):精确匹配 routingKey。
  • Fanout(广播):将消息路由到所有绑定的队列。
  • Topic(主题):支持通配符(* 匹配一个单词,# 匹配多个)。
  • Headers:根据消息头属性路由。
Exchange 对比图(Mermaid)
Topic
log.error
log.*
*.error
Topic Exchange
Producer
Log Queue
Error Queue
Fanout
Fanout Exchange
Producer
Queue1
Queue2
Direct
routingKey=error
error
Direct Exchange
Producer
Error Queue

2. ACK 确认机制

  • 自动 ACK:一旦消息投递给消费者即认为成功。
  • 手动 ACK:消费完成后调用 basicAck,防止消息丢失。
  • NACK:处理失败,可重新入队或丢弃。

3. 死信队列(DLX)

  • 消息过期、队列满、被拒绝时进入 DLX。
  • 常用于延迟任务、失败重试。

4. 消息持久化

  • Exchange、Queue、Message 都需设置持久化属性。
  • 保证宕机后数据不丢。

五、源码浅析

RabbitMQ 基于 Erlang/OTP 平台,具备天然的高并发和分布式能力。核心源码逻辑:

  1. 消息投递

    • Basic.Publish → Exchange → Binding → Queue → Consumer。
  2. 路由实现

    • Direct:哈希表存储 routingKey → Queue 映射。
    • Topic:基于 trie 前缀树匹配。
    • Fanout:遍历所有绑定的队列。
  3. 持久化机制

    • 采用顺序写入 + 内存页缓存,保证性能和可靠性平衡。

六、总结

  • RabbitMQ 遵循 AMQP 协议,相比 Kafka、RocketMQ,更注重 灵活路由与可靠投递

  • 适合业务场景:

    • 需要灵活的消息路由(Direct/Fanout/Topic/Headers)。
    • 对消息可靠性要求高(金融、支付、订单系统)。
  • SpringBoot 提供了简洁的集成方式(RabbitTemplate + @RabbitListener)。

  • 实际应用中,可以通过 死信队列、延迟队列、手动 ACK 来增强可靠性。

posted @ 2025-09-17 16:37  NeoLshu  阅读(3)  评论(0)    收藏  举报  来源