RabbitMQ 教程
一、RabbitMQ 简介
1. 什么是 RabbitMQ?
- 定义:RabbitMQ 是一个基于 AMQP(高级消息队列协议)的开源消息中间件,用于实现分布式系统中的消息传递与异步通信。
- 核心功能:
- 支持多种消息模型(简单队列、工作模式、发布/订阅、路由、主题、RPC)。
- 提供可靠消息投递(持久化、确认机制)。
- 支持多语言客户端(Java、Python、Go 等)。
- 虚拟主机(Virtual Host)实现数据隔离。
- 适用场景:
- 系统解耦(如电商订单处理、支付通知)。
- 异步任务处理(如邮件发送、日志收集)。
- 流量削峰(如高并发请求的缓冲处理)。
二、环境搭建
1. 前置条件
- 安装 Erlang:RabbitMQ 依赖 Erlang 环境,需先安装 Erlang OTP。
- Windows:下载
erlang-solutions-1.0-1.noarch.rpm
并安装。 - Linux:通过包管理器安装(如
yum install erlang
)。
- 配置环境变量:
- 将 Erlang 的
bin
目录添加到系统 PATH
。
2. 安装 RabbitMQ
(1) Windows 系统
- 下载 RabbitMQ 安装包(如
rabbitmq-server-3.12.0.exe
)。 - 双击安装,默认配置即可。
- 安装完成后,进入
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0\sbin
目录。 - 启用管理插件:
rabbitmq-plugins enable rabbitmq_management
- 启动服务:
net start RabbitMQ
- 访问管理控制台:
http://localhost:15672
,默认账号 guest/guest
。
(2) Linux 系统
wget http://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm
sudo yum install erlang
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.12.0/rabbitmq-server-3.12.0-1.el7.noarch.rpm
sudo rpm -ivh rabbitmq-server-3.12.0-1.el7.noarch.rpm
sudo rabbitmq-plugins enable rabbitmq_management
sudo systemctl start rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo firewall-cmd --permanent --add-port=15672/tcp
sudo firewall-cmd --reload
三、核心概念与架构
1. 核心组件
组件 | 作用 |
---|
Broker | 消息服务器,负责接收、存储和转发消息。 |
Exchange | 交换机,根据路由规则将消息分发到绑定的队列。 |
Queue | 消息队列,存储消息并提供给消费者消费。 |
Binding | 绑定关系,定义交换机如何将消息路由到队列(通过 Routing Key)。 |
Virtual Host | 虚拟主机,实现逻辑上的数据隔离(类似命名空间)。 |
Producer | 生产者,发送消息到交换机。 |
Consumer | 消费者,从队列中获取并处理消息。 |
2. 消息流程
Producer -> Exchange -> Queue -> Consumer
- 生产者将消息发送到交换机。
- 交换机根据路由规则将消息绑定到队列。
- 消费者从队列中消费消息。
四、编程实践
1. Java 示例代码
(1) 添加依赖(Maven)
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.12.0</version>
</dependency>
(2) 生产者代码(发送消息)
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("myQueue", true, false, false, null);
String message = "Hello RabbitMQ!";
channel.basicPublish("", "myQueue", null, message.getBytes());
System.out.println("消息已发送");
channel.close();
connection.close();
(3) 消费者代码(接收消息)
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
factory.setVirtualHost("/");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare("myQueue", true, false, false, null);
DeliverCallback callback = (consumerTag, delivery) -> {
String msg = new String(delivery.getBody(), "UTF-8");
System.out.println("收到消息: " + msg);
};
channel.basicConsume("myQueue", true, callback, consumerTag -> {});
System.in.read();
五、高级功能与模式
1. 交换机类型
类型 | 说明 |
---|
Fanout | 广播模式,将消息推送到所有绑定的队列(发布/订阅模式)。 |
Direct | 路由模式,根据 Routing Key 将消息路由到匹配的队列。 |
Topic | 主题模式,支持通配符(如 * 和 # )的模糊匹配路由。 |
Headers | 头模式,根据消息头部属性进行路由(较少使用)。 |
2. 消息持久化
- 作用:防止服务器重启或崩溃时丢失消息。
- 配置方式:
channel.queueDeclare("myQueue", true, false, false, null);
channel.basicPublish("", "myQueue", MessageProperties.MINIMAL_PERSISTENT_BASIC, message.getBytes());
3. 工作模式(Work Mode)
- 场景:多个消费者共享一个队列,实现负载均衡。
- 特点:消息会被轮询分配给消费者,避免单点压力。
- 示例:在消费者端设置
basicQos(1)
并手动确认消息。
4. 发布/订阅模式(Fanout Exchange)
- 场景:一条消息需要被多个消费者同时处理(如日志广播)。
- 示例:
channel.exchangeDeclare("logs", BuiltinExchangeType.FANOUT);
channel.queueBind("queue1", "logs", "");
channel.queueBind("queue2", "logs", "");
channel.basicPublish("logs", "", null, "Log Message".getBytes());
六、常见问题与命令
1. 常用命令
命令 | 作用 |
---|
rabbitmqctl status | 查看 RabbitMQ 状态。 |
rabbitmqctl list_queues | 列出所有队列。 |
rabbitmqctl stop | 停止 RabbitMQ 服务。 |
rabbitmqctl restart | 重启 RabbitMQ 服务。 |
rabbitmq-plugins | 管理插件(如启用/禁用管理插件)。 |
2. 日志分析
- 日志位置:
/var/log/rabbitmq/
(Linux)或 C:\Program Files\RabbitMQ Server\rabbitmq_server-3.12.0\log
(Windows)。 - 常见错误:
- Erlang Cookie 不匹配:将
.erlang.cookie
文件复制到 C:\Windows\System32\config\systemprofile
(Windows)或 /var/run/rabbitmq
(Linux)。 - 端口占用:修改配置文件或关闭占用端口的程序。
七、参考资源