一、安装
- 官方下载地址: https://www.rabbitmq.com/download.html
- Erlang下载地址: https://www.erlang.org/downloads (RabbitMQ依赖Erlang)
1. Windows
1.1. 安装步骤
- 下载Erlang OTP并安装
- 下载RabbitMQ安装包(.exe)
- 按照提示安装
1.2. 服务管理
1 | :: 启动RabbitMQ服务 |
1.3. 管理插件启用
1 | :: 启用管理界面插件 |
2. Linux (Ubuntu/Debian)
2.1. 安装Erlang
1 | 添加Erlang仓库 |
2.2. 安装RabbitMQ
1 | 添加RabbitMQ仓库 |
3. Docker安装
1 | 拉取RabbitMQ镜像 |
4. Kubernetes Helm安装
4.1. 前置条件
- 已安装 Kubernetes 集群
- 已安装 Helm 3
- 已配置 kubectl 连接到集群
1 | 检查 Kubernetes 集群状态 |
4.2. 编写 Chart
1) 准备 Chart 文件
1 | 创建 Chart 目录结构 |
2) 配置 values.yaml
1 | # 公共配置 |
3) 创建模板文件
在 templates/ 目录下创建以下文件:
secret.yaml
1 | apiVersion: v1 |
service.yaml
1 | {{ if eq .Values.app.mode "standard" }} |
statefulset.yaml
1 | apiVersion: apps/v1 |
4) 安装 Chart
1 | 创建命名空间 |
4.3. 访问 RabbitMQ
1 | 获取 NodePort |
4.4. 升级和卸载
1 | 升级 Release |
4.5. 配置持久化存储
1 | # 在 values.yaml 中添加持久化配置 |
4.6. 配置资源限制
1 | # 在 values.yaml 中配置资源限制 |
4.7. 踩坑记
1) Erlang版本不兼容
- RabbitMQ对Erlang版本有严格要求,版本不匹配会导致启动失败
- 查看兼容性列表: https://www.rabbitmq.com/which-erlang.html
1 | 查看Erlang版本 |
2) 端口冲突
- 默认端口: 5672 (AMQP), 15672 (管理界面)
- 检查端口占用
1 | Linux |
二、配置
1. 配置文件位置
- Linux:
/etc/rabbitmq/rabbitmq.conf - Windows:
%APPDATA%\RabbitMQ\rabbitmq.conf
2. 基本配置示例
1 | # 监听地址和端口 |
3. 配置查看
1 | 查看当前配置 |
4. 配置说明
4.1. 内存管理
1 | # 内存高水位标记,达到此值会阻塞生产者 |
4.2. 磁盘空间管理
1 | # 磁盘空间限制,低于此值会阻塞生产者 |
4.3. 集群配置
1 | # 集群节点通信端口 |
三、命令操作
1. 基础管理命令
1.1. 服务管理
1 | 启动RabbitMQ |
1.2. 用户管理
1 | 添加用户 |
1.3. 虚拟主机管理
1 | 添加虚拟主机 |
2. 队列和交换机管理
2.1. 队列操作
1 | 查看队列列表 |
2.2. 交换机操作
1 | 查看交换机列表 |
2.3. 绑定管理
1 | 查看绑定关系 |
3. 消息操作
3.1. 消息查看
1 | 获取队列中的消息数量 |
3.2. 消息移动
1 | 将消息从一个队列移动到另一个队列 |
四、原理和代码示例
1. 核心组件
1.1. 生产者(Producer)
- 消息的发送方
- 将消息发送到交换机
1.2. 消费者(Consumer)
- 消息的接收方
- 从队列中获取消息并处理
1.3. 交换机(Exchange)
- 接收生产者发送的消息
- 根据绑定规则将消息路由到队列
1.4. 队列(Queue)
- 存储消息的容器
- 消费者从队列中获取消息
1.5. 绑定(Binding)
- 交换机和队列之间的关联关系
- 包含路由键规则
1.6. 路由键(Routing Key)
- 消息的路由规则
- 交换机根据路由键决定消息发送到哪个队列
2. 交换机(Exchange)
2.1. 类型
1) Direct Exchange
- 精确匹配路由键
- 一对一关系
1 | // Go示例 |
2) Fanout Exchange
- 广播模式,忽略路由键
- 一对多关系
1 | // Go示例 |
3) Topic Exchange
- 模式匹配路由键
- 支持通配符:
*(一个单词),#(零个或多个单词)
1 | // Go示例 |
4) Headers Exchange
- 基于消息头属性路由
- 不使用路由键
1 | // Go示例 |
2.2. 其他属性
1) durable
作用: 决定交换机是否持久化存储
true: 交换机持久化,RabbitMQ重启后仍然存在false: 交换机临时存在,RabbitMQ重启后消失
应用场景:
- 生产环境关键业务:在电商订单处理、支付系统等核心业务中,交换机必须持久化,确保RabbitMQ服务重启后交换机仍然存在,避免消息路由中断。
- 系统可靠性要求高的场景:金融交易系统、银行核心系统等对数据一致性要求极高的场景,持久化交换机是基础保障。
- 长时间运行的服务:7×24小时不间断运行的服务,如消息通知系统、日志收集系统等,需要保证交换机的持久性。
- 避免重复配置:在复杂的微服务架构中,交换机配置复杂,持久化可以避免服务重启后需要重新创建和配置交换机。
2) auto-deleted
作用: 决定交换机是否在没有绑定队列时自动删除
true: 当最后一个绑定队列解绑后,交换机自动删除,注意:没有绑定过队列不会清理false: 交换机需要手动删除
应用场景:
- 临时任务处理:在批处理作业、定时任务等场景中,任务完成后交换机自动删除,避免资源浪费。
- 动态服务发现:在微服务架构中,临时服务实例注册的交换机,服务下线后自动清理,保持系统整洁。
- 测试环境:在单元测试、集成测试中,创建临时交换机进行测试,测试完成后自动删除,避免测试数据污染。
- 短期会话管理:聊天应用、在线会议等场景中,会话相关的交换机在会话结束后自动删除。
- 资源敏感环境:在资源受限的环境(如容器、Serverless)中,自动删除不使用的交换机,优化资源利用。
3) internal
作用: 决定交换机是否为内部交换机
true: 内部交换机,只能被其他交换机绑定,不能被生产者直接使用false: 普通交换机,可以被生产者直接使用
内部交换机使用Bind函数将此交换机绑定到其他交换机的下一跳,一般用于一些内部敏感的交换机,避免外部直接访问。
4) no-wait
作用: 决定是否等待服务器确认操作完成
true: 异步操作,不等待服务器确认,立即返回false: 同步操作,等待服务器确认后返回
当前操作是否等待,不等待则拿不到一些错误信息。一般不用,只有特定要求性能很高的场景可以自己保证一定成功的时候使用
3. 队列
4. 消息
五、小技巧与高级特性
1. 消息确认机制
1.1. 自动确认
1 | // 消费者自动确认 |
1.2. 手动确认
1 | func callback(d amqp.Delivery) { |
1.3. 拒绝消息
1 | func callback(d amqp.Delivery) { |
2. 消息持久化
2.1. 队列持久化
1 | // 声明持久化队列 |
2.2. 消息持久化
1 | // 发送持久化消息 |
3. 消息优先级
1 | // 声明支持优先级的队列 |
4. 死信队列
4.1. 配置死信队列
1 | // 声明死信交换机 |
4.2. 死信队列使用场景
- 消息过期
- 队列长度限制
- 消息被拒绝且不重新入队
5. 延迟队列
5.1. 使用TTL实现延迟队列
1 | // 声明延迟队列 |
5.2. 使用延迟插件
1 | 安装延迟插件 |
1 | // Go示例 |
六、集群
1. 集群架构
1.1. 普通集群
[待补充mermaid图]
- 队列在单个节点上,其他节点只有元数据
- 节点故障时队列不可用
1.2. 镜像集群
[待补充mermaid图]
- 队列在多个节点上复制
- 高可用性,节点故障时自动切换
2. 搭建步骤
2.1. 准备工作
1 | 在所有节点上安装RabbitMQ |
2.2. 组建集群
1 | 在node2和node3上执行,加入node1的集群 |
2.3. 配置镜像队列
1 | 设置镜像策略 |
3. 集群管理
3.1. 节点管理
1 | 查看集群状态 |
3.2. 集群同步
1 | 手动同步队列 |
3.3. 集群脑裂
问题: 集群节点间通信中断,形成多个分区
原因:
- 网络分区
- 节点故障
- 配置错误
解决方案:
1 | 配置自动恢复 |
七、监控和运维
1. 管理界面
1.1. 访问管理界面
- URL: http://localhost:15672
- 默认用户: guest/guest
1.2. 主要功能
- 连接管理
- 通道管理
- 交换机管理
- 队列管理
- 消息查看
- 用户管理
- 策略管理
2. 命令行监控
2.1. 基础监控
1 | 查看连接数 |
2.2. 性能监控
1 | 查看队列消息速率 |
3. 日志管理
3.1. 日志配置
1 | # 日志级别 |
3.2. 日志分析
1 | 查看错误日志 |
4. 性能调优
4.1. 内存优化
1 | # 调整内存高水位 |
4.2. 磁盘优化
1 | # 调整磁盘空间限制 |
4.3. 网络优化
1 | # 调整TCP缓冲区 |
八、实战
1. 最简单的rabbitmq的客户端和服务端实现
生产者
1 | package main |
消费者
1 | package main |
1. 最佳实践
1.1. 消息设计
- 使用有意义的队列名称
- 合理设置消息TTL
- 使用适当的交换机类型
- 避免过大的消息体
1.2. 错误处理
- 实现消息确认机制
- 使用死信队列处理失败消息
- 实现重试机制
- 记录详细的错误日志
1.3. 性能优化
- 使用连接池
- 批量发送消息
- 合理设置预取计数
- 监控系统资源使用
1.4. 工程化
1.5. 安全
[待补充]
2. 防止消息重复消费
[待补充]
3. 排查消息堆积
[待补充]
4. 如何保证消息顺序性(正常、重试、死信队列情况下)
[待补充]
九、踩坑记
1. 消息问题
1.1. 消息堆积
1 | 查看队列消息数量 |
1.2. 消息丢失
1 | 检查队列持久化设置 |
2. 性能问题
2.1. 内存使用过高
1 | 查看内存使用 |
2.2. 磁盘空间不足
1 | 查看磁盘使用 |

