- A+
RabbitMQ 是一个开源的消息代理中间件,基于 AMQP(高级消息队列协议)标准实现,用于在分布式系统中实现异步通信和解耦服务。它支持多种消息模式、多语言客户端,并提供可靠的消息传递机制,广泛应用于微服务架构、分布式系统和大数据场景。
核心概念
- 消息队列(Queue)
- 存储消息的缓冲区,生产者(Producer)发送消息到队列,消费者(Consumer)从队列获取消息。
- 支持多消费者竞争消费,实现负载均衡。
- 交换器(Exchange)
- 接收生产者发送的消息,并根据路由规则(Binding Key)将消息路由到一个或多个队列。
- 类型包括:直连(Direct)、主题(Topic)、扇形(Fanout)、头模式(Headers)。
- 绑定(Binding)
- 定义交换器与队列之间的关联关系,通过 Binding Key 指定路由规则。
- 虚拟主机(Virtual Host)
- 独立的命名空间,隔离不同用户的资源(交换器、队列等),类似数据库中的 Schema。
- 连接(Connection)
- 客户端与 RabbitMQ 服务器之间的 TCP 连接。
- 信道(Channel)
- 轻量级的连接,复用 TCP 连接,减少资源消耗,客户端通过信道操作 AMQP 命令。
工作模式
RabbitMQ 支持多种消息模式,常见的有:
- 简单模式(Simple)
- 一个生产者对应一个消费者,消息直接发送到队列。
- 工作队列模式(Work Queue)
- 多个消费者竞争消费同一个队列中的消息,适用于负载均衡。
- 发布 - 订阅模式(Publish/Subscribe)
- 生产者将消息发送到扇形交换器(Fanout Exchange),交换器将消息广播到所有绑定的队列。
- 路由模式(Routing)
- 生产者将消息发送到直连交换器(Direct Exchange),根据路由键(Routing Key)和 Binding Key 匹配,将消息路由到对应队列。
- 主题模式(Topic)
- 类似路由模式,但 Binding Key 支持通配符(
*
匹配一个单词,#
匹配零个或多个单词)。
- 类似路由模式,但 Binding Key 支持通配符(
- RPC 模式
- 基于消息队列实现远程过程调用,支持同步请求 - 响应。
高可用性与可靠性
- 镜像队列(Mirrored Queues)
- 将队列镜像到多个节点,主节点故障时自动切换到从节点,保证高可用。
- 持久化机制
- 交换器、队列和消息都可设置持久化,确保 RabbitMQ 重启后数据不丢失。
- 确认机制
- 生产者通过 Publisher Confirms 确认消息是否到达交换器。
- 消费者通过手动确认(Manual Ack)确保消息处理完成后才从队列删除。
- 死信队列(Dead Letter Queue)
- 处理未被消费的消息(如过期、被拒绝且不再重新入队的消息)。
集群与联邦
- 集群(Cluster)
- 多个 RabbitMQ 节点组成集群,共享配置和状态信息,提高吞吐量和可用性。
- 分为普通集群(Queue 仅存在于创建它的节点)和镜像集群(Queue 复制到多个节点)。
- 联邦(Federation)
- 跨地域、跨数据中心的 RabbitMQ 节点连接,解决广域网环境下的消息传递问题。
性能优化
- 预取计数(Prefetch Count):控制消费者一次获取的消息数量,避免消费者过载。
- 持久化策略:权衡性能与可靠性,非关键消息可设置为非持久化。
- 消息压缩:对大消息进行压缩,减少网络传输开销。
- 监控工具:使用 RabbitMQ Management 插件、Prometheus + Grafana 监控队列长度、吞吐量等指标。
常见应用场景
- 异步处理
- 将耗时操作(如文件上传、视频转码)放入队列,提高系统响应速度。
- 服务解耦
- 微服务之间通过消息队列通信,降低服务间依赖,提高扩展性。
- 流量削峰
- 在高并发场景下,通过队列缓冲请求,避免后端服务被压垮。
- 事件驱动架构
- 基于消息队列实现事件发布 - 订阅,支持系统扩展和集成。
- 数据同步
- 跨系统数据同步,如用户注册后同步到多个服务。
与其他消息队列对比
特性 | RabbitMQ | Kafka | RocketMQ | Redis Streams |
---|---|---|---|---|
协议 | AMQP、MQTT、STOMP 等 | 自定义协议 | 自定义协议 | Redis 协议 |
消息顺序性 | 单队列保证顺序 | 分区内保证顺序 | 支持顺序消息 | 分区内保证顺序 |
吞吐量 | 中等(万级 TPS) | 高(十万级 TPS) | 高(十万级 TPS) | 较高(万级 TPS) |
消息持久化 | 支持(磁盘 / 内存) | 基于磁盘,高可靠性 | 基于磁盘,高可靠性 | 基于磁盘,可配置 |
高可用性 | 镜像队列、仲裁队列 | 多副本机制 | 主从架构 | 哨兵 / 集群模式 |
社区活跃度 | 高 | 高 | 中(国内社区活跃) | 高 |
适用场景 | 企业级集成、复杂路由 | 大数据、日志收集、流处理 | 金融级场景、事务消息 | 缓存、简单消息队列 |
RabbitMQ 以其丰富的功能、灵活的路由机制和广泛的协议支持,成为企业级消息队列的首选之一。适合需要可靠消息传递、复杂路由规则和多语言支持的场景,但在超大规模数据处理场景下,Kafka 可能是更优选择。
一、编译安装 Erlang
RabbitMQ 基于 Erlang 虚拟机运行,因此需要先编译安装对应的 Erlang 版本。Erlang 的编译过程耗时较长,建议提前配置好编译环境。
依赖版本兼容性说明
RabbitMQ 与 Erlang 版本存在严格的兼容性限制,需要提前确认两者的匹配关系:
RabbitMQ 3.10.x 兼容 Erlang 23.2 至 24.x
RabbitMQ 3.9.x 兼容 Erlang 23.x 至 24.x
安装依赖
yum install -y wget tar gcc gcc-c++ make openssl-devel ncurses-devel unixODBC-devel epel-release
安装图形化依赖
yum install -y wxBase wxGTK3 wxGTK3-devel
下载并解压 Erlang 源码
# 创建工作目录
mkdir -p /usr/local/src/rabbitmq && cd /usr/local/src/rabbitmq
# 下载Erlang 24.3.4源码包
wget https://github.com/erlang/otp/archive/OTP-24.3.4.tar.gz
# 解压
tar -zxvf OTP-24.3.4.tar.gz && cd otp-OTP-24.3.4
配置编译参数
./configure \
--prefix=/usr/local/erlang \
--enable-smp-support \
--enable-threads \
--enable-kernel-poll \
--with-ssl \
--without-javac
参数说明:
--prefix:指定安装路径
--enable-smp-support:启用对称多处理支持
--enable-threads:启用线程支持
--enable-kernel-poll:启用内核级事件轮询(提升性能)
--with-ssl:启用 SSL 支持(RabbitMQ 通信需用到)
编译并安装
# 编译(-j选项指定并行任务数,建议设为CPU核心数的2倍)
make -j 4
# 安装
make install
配置 Erlang 环境变量
# 添加环境变量
echo 'export PATH=$PATH:/usr/local/erlang/bin' | tee -a /etc/profile
# 生效配置
source /etc/profile
# 验证安装
erl -version
二、编译安装 RabbitMQ
下载 RabbitMQ 源码包
cd /usr/local/src/rabbitmq
# 下载RabbitMQ 3.10.12通用Unix版本(无需编译,解压即可用)
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.10.12/rabbitmq-server-generic-unix-3.10.12.tar.xz
# 解压(注意文件后缀为.tar.xz,需用xz工具解压)
tar -xvf rabbitmq-server-generic-unix-3.10.12.tar.xz
# 移动到安装目录
mv rabbitmq_server-3.10.12 /usr/local/rabbitmq
配置 RabbitMQ 环境变量
# 添加到环境变量
echo 'export PATH=$PATH:/usr/local/rabbitmq/sbin' | tee -a /etc/profile
source /etc/profile
设置系统服务
cat > /usr/lib/systemd/system/rabbitmq.service << EOF
[Service]
Type=forking
User=root
Group=root
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/erlang/bin
ExecStart=/usr/local/rabbitmq/sbin/rabbitmq-server -detached
ExecStop=/usr/local/rabbitmq/sbin/rabbitmqctl stop
ExecReload=/usr/local/rabbitmq/sbin/rabbitmqctl restart
Restart=on-failure
EOF
重载 systemd 配置
systemctl daemon-reload
三、启动服务并配置插件
# 若已配置systemd服务
sudo systemctl start rabbitmq
sudo systemctl enable rabbitmq # 设置开机自启
# 若未配置服务,直接启动
/usr/local/rabbitmq/sbin/rabbitmq-server -detached
-detached
参数表示后台运行,若需查看启动日志,可执行:
tail -f /usr/local/rabbitmq/var/log/rabbitmq/rabbit@localhost.log
启用管理界面插件
RabbitMQ 的 Web 管理界面通过插件形式提供,需手动启用:
# 启用管理插件
rabbitmq-plugins enable rabbitmq_management
# 查看已启用插件
rabbitmq-plugins list | grep enabled
配置远程访问权限
默认情况下,RabbitMQ 的 guest 用户仅允许本地访问,需创建新用户并授权:
# 创建管理员用户(用户名admin,密码xxx.com)
rabbitmqctl add_user admin xxx.com
# 赋予管理员角色
rabbitmqctl set_user_tags admin administrator
# 授予所有资源的操作权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# 验证用户配置
rabbitmqctl list_users
四、验证安装结果
检查服务状态
# 方法1:使用rabbitmqctl
rabbitmqctl status
# 方法2:查看进程
ps -ef | grep rabbitmq | grep -v grep
rabbitmqctl status
输出中若包含{running_applications,[...]}
且无错误信息,说明服务正常运行。
验证端口监听
ss -tulpn | grep beam.smp
正常情况下会监听以下端口:
5672:AMQP 协议端口(客户端连接)
15672:Web 管理界面端口
25672:节点间通信端口(集群用)
通过浏览器访问
http://服务器IP:15672

