RabbitMQ 入门指南

344 阅读3分钟
## 一、RabbitMQ 是什么?
RabbitMQ 是一个开源的消息代理和队列服务器,用于通过**异步消息传递**实现系统间的通信。它支持多种消息协议,最核心的是 AMQP(Advanced Message Queuing Protocol),具有以下核心优势:
-**解耦系统**:生产者和消费者无需知道对方存在
-**流量削峰**:应对突发高并发请求
-**异步处理**:提升系统响应速度

---

## 二、5 分钟快速搭建环境
### 通过 Docker 启动(推荐)
```bash
docker run -d --name rabbitmq \
 -p 5672:5672 \
 -p 15672:15672 \
 rabbitmq:management
  • 5672:AMQP 协议端口(代码连接用)
  • 15672:Web 管理界面(浏览器访问 http://localhost:15672)
  • 默认账号:guest / guest

三、Java 代码示例(完整可运行)

1. 添加 Maven 依赖

<dependency>
    <groupId>com.rabbitmq</groupId>
    <artifactId>amqp-client</artifactId>
    <version>5.16.0</version>
</dependency>

2. 生产者代码(发送消息)

import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.Channel;

public class Producer {
    private final static String QUEUE_NAME = "JAVA_QUEUE";

    public static void main(String[] args) throws Exception {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
      
        try (Connection connection = factory.newConnection();
             Channel channel = connection.createChannel()) {
          
            // 创建持久化队列(服务重启后仍存在)
            channel.queueDeclare(QUEUE_NAME, true, false, false, null);
          
            String message = "Hello RabbitMQ!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("✅ 消息发送成功: " + message);
        }
    }
}

3. 消费者代码(接收消息)

import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    private final static String QUEUE_NAME = "JAVA_QUEUE";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory factory = new ConnectionFactory();
        factory.setHost("localhost");
      
        Connection connection = factory.newConnection();
        Channel channel = connection.createChannel();
      
        channel.queueDeclare(QUEUE_NAME, true, false, false, null);
        System.out.println("🔄 等待接收消息...");

        DeliverCallback deliverCallback = (consumerTag, delivery) -> {
            String message = new String(delivery.getBody(), "UTF-8");
            System.out.println("✅ 收到消息: " + message);
        };
      
        channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {});
      
        // 保持程序持续运行
        while (true) {
            Thread.sleep(1000);
        }
    }
}

四、运行演示

  1. 启动生产者 运行 Producer.java,输出:

    ✅ 消息发送成功: Hello RabbitMQ!
    
  2. 启动消费者 运行 Consumer.java,输出:

    🔄 等待接收消息...
    ✅ 收到消息: Hello RabbitMQ!
    
  3. Web 管理界面验证 访问 http://localhost:15672 可以看到队列 JAVA_QUEUE 中有一条消息


五、核心概念解析

组件作用说明
Producer消息生产者,通过 basicPublish 发送消息
Consumer消息消费者,通过 basicConsume 订阅队列
Queue消息存储的队列,具有 FIFO 特性
Exchange消息路由组件(支持 Direct/Fanout/Topic 等类型)
Binding将 Exchange 和 Queue 绑定,定义路由规则

六、实际应用场景

  1. 电商订单系统

    graph LR
    订单服务-->|发送消息| RabbitMQ
    RabbitMQ-->|处理消息| 库存服务
    RabbitMQ-->|处理消息| 支付服务
    RabbitMQ-->|处理消息| 物流服务
    
  2. 日志收集系统 多个微服务将日志发送到 RabbitMQ,由统一消费者进行存储和分析

  3. 实时通知系统 用户操作(如点赞、评论)通过消息队列触发实时推送


七、最佳实践建议

  1. 消息持久化 队列和消息都设置为持久化,防止服务器重启丢失数据

    // 队列持久化
    channel.queueDeclare(QUEUE_NAME, true, false, false, null);
    // 消息持久化
    channel.basicPublish("", QUEUE_NAME, 
        MessageProperties.PERSISTENT_TEXT_PLAIN, 
        message.getBytes());
    
  2. 手动消息确认 消费者处理完成后手动发送 ACK,避免消息丢失

    channel.basicConsume(QUEUE_NAME, false, deliverCallback, consumerTag -> {});
    // 处理完成后调用
    channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
    
  3. 设置 Qos 限制 防止消费者过载,每次只处理一条消息

    channel.basicQos(1);  // 每次处理1条消息
    

八、总结

RabbitMQ 的 Java 客户端使用非常简洁,通过本文的示例代码您可以快速实现:

  • 消息队列的创建与管理
  • 消息的发送与消费
  • 基本的生产者-消费者模型

建议后续深入探索:

  • 不同 Exchange 类型的路由机制
  • 消息确认与重试机制
  • 集群化部署方案