RabbitMQ 概述
什么是 RabbitMQ
RabbitMQ 是一个开源的消息代理和队列服务器
- 核心功能
- 消息传递
异步处理: 解耦系统、 - 路由机制
支持多种交换器类型: - 持久化
保证消息不丢失: - 集群
支持高可用和负载均衡:
- 消息传递
- 主要优势
- 可靠性
支持消息确认: 持久化、 - 灵活性
多种交换器类型: 路由规则灵活, - 易用性
提供多种客户端库: - 社区活跃
文档丰富: 生态完善,
- 可靠性
RabbitMQ 的核心概念
核心组件
- Producer
生产者( ) - 发送消息的应用程序
- 将消息发送到 Exchange
- Consumer
消费者( ) - 接收并处理消息的应用程序
- 从 Queue 中获取消息
- Exchange
交换器( ) - 接收生产者发送的消息
- 根据路由键将消息路由到队列
- Queue
队列( ) - 存储消息的容器
- 消费者从队列中获取消息
- Binding
绑定( ) - Exchange 和 Queue 之间的连接关系
- 定义路由规则
- Routing Key
路由键( ) - 生产者发送消息时指定的键
- Exchange 根据路由键决定消息去向
- Virtual Host
虚拟主机( ) - 逻辑隔离的消息环境
- 类似数据库中的 schema
交换器类型
- Direct Exchange
直连交换器( ) - 精确匹配路由键
- 一对一或一对多
- Fanout Exchange
扇出交换器( ) - 广播模式
忽略路由键, - 发送给所有绑定的队列
- 广播模式
- Topic Exchange
主题交换器( ) - 模式匹配路由键
- 支持通配符
*和#
- Headers Exchange
头交换器( ) - 根据消息头属性匹配
- 较少使用
RabbitMQ 的工作原理
消息流转过程
1 | 1. Producer 发送消息到 Exchange |
工作模式
1 | 简单模式 |
环境搭建
安装 RabbitMQ
Docker 安装( 推荐)
1 | # 拉取镜像 |
Linux 安装
1 | # Ubuntu/Debian |
Windows 安装
下载地址
: https://www.rabbitmq.com/install-windows.html
步骤
- 安装 Erlang
RabbitMQ 依赖( ) - 下载 RabbitMQ 安装包
- 运行安装程序
- 启用管理插件
: rabbitmq-plugins enable rabbitmq_management
macOS 安装
1 | # 使用 Homebrew |
基本配置
1 | # 添加用户 |
验证安装
1 | # 检查服务状态 |
核心概念详解
交换器( Exchange)
Direct Exchange
1 | // 声明直连交换器 |
Fanout Exchange
1 | // 声明扇出交换器 |
Topic Exchange
1 | // 声明主题交换器 |
Headers Exchange
1 | // 声明头交换器 |
队列( Queue)
队列属性
| 属性 | 说明 | 默认值 |
|---|---|---|
| durable | 是否持久化 | false |
| exclusive | 是否独占 | false |
| autoDelete | 是否自动删除 | false |
| arguments | 其他参数 | null |
1 | // 声明持久化队列 |
消息属性
1 | // 构建消息属性 |
Java 客户端使用
添加依赖
1 | <!-- RabbitMQ Java Client --> |
简单模式
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
工作队列模式
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
发布订阅模式
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
路由模式
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
主题模式
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
Spring Boot 整合
添加依赖
1 | <!-- Spring Boot AMQP --> |
配置文件
1 | # application.yml |
配置类
1 | package com.example.config; |
生产者
1 | package com.example.producer; |
消费者
1 | package com.example.consumer; |
Controller
1 | package com.example.controller; |
高级特性
消息确认机制
生产者确认
1 | // 开启发布者确认 |
消费者确认
1 | // 手动 ACK |
死信队列
配置死信队列
1 |
|
死信队列触发条件
| 触发条件 | 说明 |
|---|---|
| 消息被拒绝 | basicNack/basicReject 且 requeue=false |
| 消息过期 | 超过 TTL 时间 |
| 队列达到最大长度 | 超过 x-max-length 限制 |
延迟队列
使用插件实现
1 | # 下载延迟插件 |
1 |
|
消息优先级
1 | // 声明优先级队列 |
集群与高可用
普通集群
1 | # 在多台服务器上安装 RabbitMQ |
镜像队列
1 | # 设置镜像队列策略 |
Quorum 队列( 推荐)
1 | // 声明 Quorum 队列 |
| 特性 | 经典队列 | 镜像队列 | Quorum 队列 |
|---|---|---|---|
| 高可用 | ✗ | ✓ | ✓ |
| 数据一致性 | - | 最终一致 | 强一致 |
| 性能 | 高 | 中 | 中 |
| 推荐场景 | 非关键数据 | 兼容旧版本 | 关键数据 |
最佳实践
命名规范
1 | 交换器命名 |
性能优化
1 | // 1. 使用连接池 |
可靠性保障
1 | // 1. 消息持久化 |
监控建议
1 | # 1. 监控队列长度 |
常见问题
消息丢失问题
1 | 问题 |
消息重复消费
1 | 问题 |
1 | // 幂等性示例 |
消息积压问题
1 | 问题 |
1 | # 增加并发消费者 |
报错处理
💗💗 RabbitMQ 报错: Connection refused
1 | 错误信息 |
💗💗 RabbitMQ 报错: PRECONDITION_FAILED
1 | 错误信息 |
💗💗 RabbitMQ 报错: NOT_FOUND
1 | 错误信息 |
学习资源
- 视频
- 尚硅谷 - 2021 最新 RabbitMQ 教程
: https://www.bilibili.com/video/BV1cb4y1o7zz
- 尚硅谷 - 2021 最新 RabbitMQ 教程
- 文档
- RabbitMQ 中文文档
: http://rabbitmq.mr-ping.com/ - RabbitMQ 官方文档
: https://www.rabbitmq.com/documentation.html - RabbitMQ GitHub
: https://github.com/rabbitmq/rabbitmq-server
- RabbitMQ 中文文档
- 书籍
RabbitMQ 实战指南《 》 朱忠华著: RabbitMQ in Action《 》 Alvaro Videla 著: RabbitMQ 实战《 高效部署分布式消息队列: 》
- 教程
- RabbitMQ 入门教程
: https://www.runoob.com/w3cnote/rabbitmq-tutorial.html - Spring AMQP 文档
: https://spring.io/projects/spring-amqp
- RabbitMQ 入门教程
- 工具
- RabbitMQ 在线模拟器
: http://tryrabbitmq.com/ - RabbitMQ Management
Web 管理界面: - rabbitmqadmin
命令行管理工具: - Apache JMeter
压力测试工具:
- RabbitMQ 在线模拟器
- 社区
- RabbitMQ 中文社区
: http://www.rabbitmq.org.cn/ - Stack Overflow RabbitMQ 标签
: https://stackoverflow.com/questions/tagged/rabbitmq
- RabbitMQ 中文社区