RabbitMQ 的安装及使用

摘要

  • 本文介绍 CentOS9 中 RabbitMQ 的安装与使用。

  • Zookeeper官网

  • 本文使用的 RabbitMQ 版本为 4.1.4。

RabbitMQ 简介

  • RabbitMQ 是一个开源的 消息队列中间件,基于 AMQP(Advanced Message Queuing Protocol,高级消息队列协议) 实现,用于在分布式系统中 解耦、缓冲和异步处理消息。

  • 它的主要作用是让 不同系统应用 之间可靠地传递消息,即使发送方或接收方暂时不可用,也能保证消息不丢失。

  • RabbitMQ 的核心特点

核心特点 具体说明
可靠性 - 支持消息确认(ACK)机制
- 消息持久化到磁盘
- 支持事务或确认模式,保证消息不会丢失
灵活的路由 - 通过 交换机(Exchange) 将消息路由到不同的 队列(Queue)
- 支持多种路由策略:
• direct:直连,按队列名路由
• fanout:广播,所有队列都收到
• topic:主题匹配,类似订阅模式
• headers:按消息头匹配
高性能 - 内存队列快速处理消息
- 支持异步 IO 和 Erlang 的并发模型
多语言支持 - 客户端库丰富:Java、Python、Go、C#、Node.js 等
- 可在多种平台和框架中使用
集群与高可用 - 支持集群模式
- 队列可以镜像到多个节点,保证高可用
  • RabbitMQ 的核心概念

概念 含义 作用范围 类比
Broker 一个 RabbitMQ 服务实例,包含整个 AMQP 服务、管理插件、队列、交换机等资源 运行在一台服务器上,或集群中的一个节点 类似于数据库的 实例
Vhost Broker 内部的 逻辑分区,用于隔离不同的队列、交换机、绑定等资源 一个 Broker 可以有多个 vhost,每个 vhost 彼此隔离 类似于数据库实例里的 schema,实际使用中建议为每个业务配置一个独立的 vhost,并为每个vhost单独配置一个管理用户
名称 说明
Producer 消息生产者,发送消息到 RabbitMQ
Queue 队列,存储消息的地方
Consumer 消息消费者,从队列获取消息
Exchange 交换机,接收 Producer 的消息并根据规则路由到队列
Binding 绑定,定义 Exchange 与 Queue 的路由规则
Message 消息,RabbitMQ 传递的数据单元
Connection 连接,客户端与 RabbitMQ Broker 之间的 TCP 连接,是通信的物理通道
Channel 通道,Connection 内部的 逻辑连接,轻量级且多路复用,一个连接可开多个通道
1
2
3
4
5
6
7
                        ┌─ Broker (RabbitMQ 实例)──────────┐
│ │
│ ┌───── Virtual Host ─────┐ │
Producer ─── TCP ──────> Exchange ──> Queue ────────> TCP ── Consumer
(Connection ──> Channel)│ └────────────────────────┘ │
│ │
└─────────────────────────────────┘

  • RabbitMQ 的典型应用场景

应用场景 说明
异步处理 用户请求不直接处理,消息入队后由后台异步消费,例如邮件发送、图片处理
削峰填谷 缓冲高峰流量,平滑系统压力
系统解耦 不同服务之间不直接调用,降低耦合
广播/通知 发布/订阅模式,实现多服务同时收到消息
日志收集 统一接收、分发日志到不同处理系统

RabbitMQ 单机安装

安装Erlang

  • RabbitMQ是基于Erlang语言开发的,所以安装RabbitMQ之前需要安装Erlang语言环境。需要注意的是RabbitMQ与Erlang语言之间是有版本对应关系的。参考官方文档Erlang Version Requirements

  • 目前RabbitMQ最新版本是4.1.4,Erlang版本可以选择 27.xGitHub下载地址

1
2
3
4
5
6
7
8
9
10
11
12
# 下载 el9 的版本,对应 CentOS 9
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v27.3.4.3/erlang-27.3.4.3-1.el9.x86_64.rpm
# 安装
sudo rpm -ivh erlang-27.3.4.3-1.el9.x86_64.rpm
# 查看安装的版本
erl
# 输出类似于,这里 Erlang/OTP 27 就表示安装的是 27.x 版本
Erlang/OTP 27 [erts-15.2.7.2] [source] [64-bit] [smp:2:2] [ds:2:2:10] [async-threads:1] [jit:ns]

Eshell V15.2.7.2 (press Ctrl+G to abort, type help(). for help)
1> q(). # 退出命令,注意是括号后面还有一个点。输入 help(). 显示帮助信息
ok

安装 RabbitMQ

1
2
3
4
5
6
7
8
9
# 下载,noarch 表示架构无关,即 X86_64 和 ARM64 都可以
# 因为没有对应的 el9 的包,所以只能用 el8 的包了,实际使用中没有问题。
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v4.1.4/rabbitmq-server-4.1.4-1.el8.noarch.rpm
# 安装
sudo rpm -ivh rabbitmq-server-4.1.4-1.el8.noarch.rpm
# 查看版本信息
rabbitmq-diagnostics version # 无需启动服务
# RabbitMQ 服务启动后方可正确输出
rabbitmqctl version

RabbitMQ 启动与停止命令

  • Erlang VM 是 Erlang 语言运行环境,RabbitMQ 应用运行在 Erlang VM 下。

  • 启动 RabbitMQ 服务(Erlang VM) + 应用

1
2
3
4
5
6
7
# 启动 RabbitMQ 服务(Erlang VM) + 应用
sudo systemctl start rabbitmq-server
# 或者,--detached 后台运行,不加就是前台运行
sudo rabbitmq-server -detached

# 单独启动 应用,此时需要保证 RabbitMQ 服务(Erlang VM) 正在运行,一般重启 应用 时使用该命令
sudo rabbitmqctl start_app
  • 停止 RabbitMQ 服务(Erlang VM) + 应用

1
2
3
4
5
6
7
# 停止 RabbitMQ 服务(Erlang VM) + 应用
sudo systemctl stop rabbitmq-server
# 或者,单机模式 stop,集群模式 shutdown
sudo rabbitmqctl stop / shutdown

# 单独停止 RabbitMQ 应用,此时需要保证 RabbitMQ 服务(Erlang VM) 正在运行,一般重启 应用 时使用该命令
sudo rabbitmqctl stop_app
  • 查看RabbitMQ 服务状态

1
2
3
sudo systemctl status rabbitmq-server
# 或者
sudo rabbitmqctl status
  • RabbitMQ 在 CentOS 9 (RPM 安装) 的目录结构

类型 目录路径 说明
配置文件 /etc/rabbitmq rabbitmq.confadvanced.config 等配置
日志文件 /var/log/rabbitmq RabbitMQ 运行日志,默认存放在这里
数据目录 /var/lib/rabbitmq/mnesia 消息队列、元数据存储目录
Erlang Cookie /var/lib/rabbitmq/.erlang.cookie Erlang 节点间通信的 cookie 文件
可执行文件 /usr/lib/rabbitmq/bin rabbitmq-serverrabbitmqctl 等命令
启动脚本 /usr/lib/systemd/system/rabbitmq-server.service systemd 管理 RabbitMQ 的启动脚本
插件目录 /usr/lib/rabbitmq/lib/rabbitmq_server-<version>/plugins 所有插件文件存放路径

激活Web管理控制台插件

  • 对于 RabbitMQ 所有的操作基本都可以通过命令行完成,但是使用起来并不方便,这时我们可以激活 rabbitmq_management 插件,该插件提供了 Web 管理控制台,我们可以通过 Web 管理控制台来管理 RabbitMQ

  • rabbitmq_management 插件为 官方插件,默认已经安装,不需要下载,直接激活即可

1
2
# 激活插件
sudo rabbitmq-plugins enable rabbitmq_management

设置远程访问帐号

  • 插件激活后可以通过浏览器访问 http://<ip>:15672,rabbitmq_management 插件默认用户名和密码都是 guest,但是默认情况下其只能通过 127.0.0.1 访问,此时我们有两种方法可以解决

1. 允许 guest 账号远程访问
1
2
3
4
5
6
# 修改 /etc/rabbitmq/rabbitmq.conf 文件
# 允许guest用户远程访问,`官方不推荐` 一直开启,建议开启后在 web 控制台中创建一个管理员账号,然后立刻关闭该配置
loopback_users.guest = false
# 默认的用户名和密码,注意这里 user 如果改成 admin,则上面的开启远程访问中的 guest 也要改成 admin
default_user = guest
default_pass = guest
  • 修改完成后,重启 RabbitMQ 服务

1
sudo systemctl restart rabbitmq-server
2. 新创建一个可以远程访问的管理员账号
  • 创建管理员账号,比如这里 用户名为 admin,密码为 rabbitmq

1
sudo rabbitmqctl add_user admin rabbitmq
  • 给管理员账号添加资源管理权限

1
sudo rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
部分 解释
rabbitmqctl RabbitMQ 的命令行管理工具,用于管理用户、权限、队列、交换机等。
set_permissions 设置指定用户在某个虚拟主机(vhost)下的权限。
-p / 指定虚拟主机(vhost)。这里的 / 是默认虚拟主机。
admin 用户名,这里是为 admin 用户设置权限。
".*"(配置权限) 第一个正则表达式,控制用户对资源配置的权限,比如创建交换机、队列、绑定等。".*" 表示全部允许。
".*"(写权限) 第二个正则表达式,控制用户向哪些资源发送消息。".*" 表示全部允许。
".*"(读权限) 第三个正则表达式,控制用户从哪些资源消费消息。".*" 表示全部允许。
  • 设置admin账号为控制台管理员

1
sudo rabbitmqctl set_user_tags admin administrator
部分 解释
rabbitmqctl RabbitMQ 的命令行管理工具。
set_user_tags 用来为用户设置标签(tag),标签决定了用户在管理界面或 API 中的权限级别。
admin 用户名,这里是为 admin 用户设置标签。
administrator 标签名,表示给该用户赋予管理员权限。
  • 常见的用户标签

标签 说明
administrator 管理员,拥有最高权限,可通过 Web 管理界面、CLI、API 管理 RabbitMQ 所有内容
monitoring 监控用户,可查看所有监控信息,但不能修改配置
management 普通管理用户,可以登录管理界面,但权限受限
policymaker 策略管理用户,可以管理策略和参数,但不能管理其他用户
无标签 普通用户,只能收发消息,不能登录管理界面
  • set_permissionsset_user_tags 总结对比

命令 控制范围 主要作用
set_permissions vhost 内的资源 发消息、收消息、创建队列、交换机
set_user_tags 管理界面、管理 API 用户管理、策略管理、集群管理

启用所有稳定的 Feature Flags

  • 登录控制台后我们会看到一条告警信息,参考:Feature Flags

1
⚠ All stable feature flags must be enabled after completing an upgrade.
  • 它的意思是:RabbitMQ 在新版本中引入了一些 Feature Flags(特性标志),这些特性标志用于控制一些新的功能或行为是否启用。升级 RabbitMQ 后,有些功能会处于 未启用状态,需要你手动开启,确保集群完全运行在最新的功能模式下。

  • 背景:为什么有 Feature Flags?

    • 向后兼容:RabbitMQ 升级时,可能引入了新的数据格式或内部机制,如果立即启用,旧版本节点可能无法理解。
    • 滚动升级支持:升级集群时,可以先升级节点,再统一启用功能,避免中途出问题。
    • 可控性:你可以选择在确认集群稳定后再启用新功能。
  • 查看当前 Feature Flags 状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
rabbitmqctl -q --formatter pretty_table list_feature_flags

# 输出会类似这样:
┌──────────────────────────────────────┬──────────┐
│ name │ state │
├──────────────────────────────────────┼──────────┤
│ classic_mirrored_queue_version │ enabled │
├──────────────────────────────────────┼──────────┤
│ classic_queue_type_delivery_support │ enabled │
├──────────────────────────────────────┼──────────┤
│ detailed_queues_endpoint │ disabled │
├──────────────────────────────────────┼──────────┤
│ direct_exchange_routing_v2 │ enabled │
├──────────────────────────────────────┼──────────┤

> enabled:特性已启用
> disabled:特性未启用
  • 可以输出 其它 格式,显示更详细的信息

1
2
3
4
# json
rabbitmqctl -q --formatter json list_feature_flags name state provided_by desc doc_url | jq
# table
rabbitmqctl -q --formatter pretty_table list_feature_flags name state provided_by desc doc_url
  • 启用所有已标记为 stable 的特性,建议升级下一个 RabbitMQ 版本 前一定要确保当前版本的 Feature Flags 都是启用的,避免升级后无法顺利启动服务。

1
rabbitmqctl enable_feature_flag all
  • 在控制台中也可以查看和开启这些 Feature Flags 的状态

  • 这里要注意,Feature Flags 一旦开启就无法关闭。

RabbitMQ 配置文件

  • 对于 RPM/YUM/DNF 安装的 RabbitMQ,配置文件默认路径是

文件类型 默认位置 作用
主配置文件(推荐) /etc/rabbitmq/rabbitmq.conf 使用 INI 格式,主要配置都在这里
环境变量配置 /etc/rabbitmq/rabbitmq-env.conf 定义节点名、Cookie 位置、数据/日志目录等
1
2
3
4
5
6
# /etc/rabbitmq/rabbitmq.conf

# 监听端口
listeners.tcp.default = 5672
# 管理界面端口
management.tcp.port = 15672
  • rabbitmq-env.conf 用来 定义节点名、Cookie 、数据/日志目录等的环境变量,RabbitMQ 启动时会自动读取该文件,以下是通过 RPM 安装的 RabbitMQ 的默认值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# /etc/rabbitmq/rabbitmq-env.conf

# 节点名称,默认使用主机短名(hostname -s),例如 rabbit@myhost
NODENAME=rabbit@<hostname>

# 绑定的 IP 地址,留空表示监听所有地址,等价于 0.0.0.0
NODE_IP_ADDRESS=

# AMQP 协议端口,默认 5672
NODE_PORT=5672

# RabbitMQ 数据库存储目录
MNESIA_BASE=/var/lib/rabbitmq/mnesia

# 日志存放目录
LOG_BASE=/var/log/rabbitmq

# 配置文件路径,不带 .conf 后缀
CONFIG_FILE=/etc/rabbitmq/rabbitmq

# 是否使用长主机名,true/false (长主机名 hostname -f)
USE_LONGNAME=false
  • 两个文件的作用

文件 作用范围 典型参数 何时加载
rabbitmq-env.conf 设置 RabbitMQ 启动时的 环境变量 NODENAME, NODE_IP_ADDRESS, NODE_PORT, LOG_BASE, MNESIA_BASE 在启动 RabbitMQ 服务前由 rabbitmq-env 脚本读取
rabbitmq.conf RabbitMQ 运行时配置(内部参数、插件配置等) listeners.tcp.default, log, cluster_formation 等 RabbitMQ 启动后由 Erlang VM 内部读取
  • rabbitmq-env.conf 决定 RabbitMQ 启动时的基本环境,比如节点名、数据目录、监听 IP 等,必须在启动前就确定。

  • rabbitmq.conf 决定运行时的功能,比如端口监听、日志等级、集群配置等,可以动态修改,重启应用后生效。

rabbitmq-env.conf 变量 rabbitmq.conf 对应配置 优先级 说明
NODE_IP_ADDRESS listeners.tcp.default = <IP> rabbitmq.conf 只要在 rabbitmq.conf 里配置,就覆盖环境变量
NODE_PORT listeners.tcp.default = <Port> rabbitmq.conf 同上,IP 和端口可以一起配置
NODENAME 无直接对应 rabbitmq-env.conf 节点名只能通过 rabbitmq-env.conf 或环境变量设定
MNESIA_BASE 无直接对应 rabbitmq-env.conf 数据目录只能在启动前设定
LOG_BASE log.dir = <path> rabbitmq.conf 运行时配置覆盖环境变量
CONFIG_FILE 无直接对应 rabbitmq-env.conf 这个只决定加载哪个 rabbitmq.conf 文件
USE_LONGNAME 无直接对应 rabbitmq-env.conf 节点名是否使用长主机名只能启动前决定

RabbitMQ 相关命令

  • 日常使用中,基本都是通过 Web 管理界面操作,这里仅对命令进行简要介绍。

命令 作用(简要) 常用示例(典型用法 + 中文说明)
rabbitmq-defaults 定义/显示 RabbitMQ 安装默认目录和运行时前缀 编辑 sbin/rabbitmq-defaults 中 PREFIX/SYS_PREFIX(修改默认目录到系统目录)
rabbitmq-diagnostics 健康检查 / 诊断工具,可用于监控 rabbitmq-diagnostics -q ping(检查节点是否可达)
rabbitmq-diagnostics -q status(查看节点状态)
rabbitmq-diagnostics -q check_running(确认节点运行中)
rabbitmq-env rabbitmq-env 其实不是一个直接在命令行里单独使用的工具,而是 RabbitMQ 服务启动脚本 中用来加载 RabbitMQ 环境变量的脚本。 /etc/rabbitmq/rabbitmq-env.conf 中设置:
RABBITMQ_NODENAME=myrabbit(设置节点名)
或用 rabbitmq-env 输出查看实际环境
rabbitmq-plugins 插件管理:列出/启用/禁用插件 rabbitmq-plugins list(列出所有插件)
rabbitmq-plugins enable rabbitmq_management(启用 Web 管理插件)
rabbitmq-plugins disable --offline plugin(离线禁用插件)
rabbitmq-queues 队列副本管理:rebalance/grow/shrink rabbitmq-queues rebalance all --vhost-pattern ".*" --queue-pattern ".*"(重平衡所有队列副本)
rabbitmq-queues add_member --vhost / qname rabbit@node(为队列增加节点副本)
rabbitmq-server 启动 RabbitMQ 节点(前台/后台) rabbitmq-server(前台启动)
rabbitmq-server -detached(后台启动)
rabbitmq-upgrade 升级相关操作:drain/恢复等 rabbitmq-upgrade drain(让节点进入维护模式,停止接收新连接)
rabbitmq-upgrade post_upgrade(执行升级后收尾操作)
rabbitmq-upgrade revive(恢复维护模式中的节点)
rabbitmqctl 最常用管理命令:用户、队列、集群管理 rabbitmqctl status(查看节点状态)
rabbitmqctl list_queues(列出所有队列)
rabbitmqctl add_user bob s3cr3t(添加用户 bob,密码 s3cr3t)
rabbitmq-streams 管理 Streams(流式队列) rabbitmq-streams stream_status --vhost / my-stream(查看 my-stream 状态)
rabbitmq-streams add_replica --vhost / my-stream rabbit@node(为 my-stream 增加副本节点)

最常用的命令 rabbitmqctl

命令自动补全

  • rabbitmqctl 有一个 autocomplete 参数,可以自动完成命令参数,我们可以利用这个命令来实现命令自动补全

  • vim ~/.bashrc 添加如下内容:

1
2
3
4
5
6
7
8
_rabbitmqctl_completion() {
local cur opts
cur="${COMP_WORDS[COMP_CWORD]}" # 当前光标所在单词
opts=$(rabbitmqctl autocomplete "$cur") # 只传当前单词作为前缀
COMPREPLY=( $(compgen -W "${opts}" -- "$cur") )
}

complete -F _rabbitmqctl_completion rabbitmqctl
  • 实际上 RabbitMQ 的大部分命令都有 autocomplete 参数,都可以自动完成命令参数

1
2
3
4
5
6
7
8
9
10
11
12
13
# 定义通用补全函数
_rabbitmq_completion() {
local cur opts
cur="${COMP_WORDS[COMP_CWORD]}"
# 当前命令名,自动判断
local cmd="${COMP_WORDS[0]}"
# 给对应命令传当前前缀
opts=$($cmd autocomplete "$cur" 2>/dev/null)
COMPREPLY=( $(compgen -W "${opts}" -- "$cur") )
}

# 一次性绑定多个命令
complete -F _rabbitmq_completion rabbitmqctl rabbitmq-plugins rabbitmq-diagnostics rabbitmq-queues rabbitmq-upgrade
  • 测试

1
2
3
4
5
6
# 使补全生效
source ~/.bashrc
# tab 补全
rabbitmqctl st<TAB>
# 输出
start_app status stop stop_app

常用命令参数

  • rabbitmqctl help 获取所有命令参数的简介

  • rabbitmqctl help <command> 获取指定命令的帮助

  • 日常使用中基本都是通过 web 控制台 完成,这里只做了解。

1.节点管理
命令 功能 示例
status 查看节点状态,包括运行状态、版本、内存、队列数量等 rabbitmqctl status
stop 停止 RabbitMQ 节点 rabbitmqctl stop
stop_app 停止 RabbitMQ 应用(保留节点运行) rabbitmqctl stop_app
start_app 启动 RabbitMQ 应用 rabbitmqctl start_app
reset 重置 RabbitMQ 节点,删除所有队列和数据(慎用) rabbitmqctl reset
force_reset 强制重置节点(即使在集群中也会重置) rabbitmqctl force_reset
2. 用户和权限管理
命令 功能 示例
list_users 列出所有用户 rabbitmqctl list_users
add_user <user> <password> 添加新用户 rabbitmqctl add_user alice mypassword
delete_user <user> 删除用户 rabbitmqctl delete_user alice
change_password <user> <password> 修改用户密码 rabbitmqctl change_password alice newpass
list_permissions <user> 查看某用户的权限 rabbitmqctl list_permissions alice
set_permissions -p <vhost> <user> "<conf>" "<write>" "<read>" 设置用户在虚拟主机的权限 rabbitmqctl set_permissions -p / alice ".*" ".*" ".*"
3. 虚拟主机(vhost)管理
命令 功能 示例
list_vhosts 列出所有虚拟主机 rabbitmqctl list_vhosts
add_vhost <vhost> 添加虚拟主机 rabbitmqctl add_vhost my_vhost
delete_vhost <vhost> 删除虚拟主机 rabbitmqctl delete_vhost my_vhost
4. 队列管理
  • 队列可以通过 web 控制台 创建, 也可以通过 客户端(比如Java) 创建,rabbitmqctl 只能查看和删除队列

命令 功能 示例
list_queues 列出队列 rabbitmqctl list_queues
list_queues name messages consumers 列出队列及消息数、消费者数 rabbitmqctl list_queues name messages consumers
purge_queue <queue> 清空队列消息 rabbitmqctl purge_queue my_queue
delete_queue <queue> 删除队列 rabbitmqctl delete_queue my_queue
5. 交换机和绑定
  • 交换机可以通过 web 控制台 创建, 也可以通过 客户端(比如Java) 创建,rabbitmqctl 只能查看

命令 功能 示例
list_exchanges 列出交换机 rabbitmqctl list_exchanges
list_bindings 列出绑定关系 rabbitmqctl list_bindings
6. 集群管理
命令 功能 示例
cluster_status 查看集群状态 rabbitmqctl cluster_status
join_cluster <node> 节点加入集群 rabbitmqctl join_cluster rabbit@node1
forget_cluster_node <node> 将节点从集群中移除 rabbitmqctl forget_cluster_node rabbit@node2
7. 日志和调试
命令 功能 示例
report 输出节点诊断报告 rabbitmqctl report
eval <expression> 执行 Erlang 表达式 rabbitmqctl eval 'rabbit_mnesia:info().'
8. 其他命令
命令 功能 示例
help 查看帮助命令 rabbitmqctl help
version 查看 RabbitMQ 版本 rabbitmqctl version
authenticate_user <user> <password> 验证用户密码 rabbitmqctl authenticate_user alice mypassword

RabbitMQ HTTP API

  • RabbitMQ 的 HTTP API 是一个 基于 REST 的管理接口,主要用于对 RabbitMQ 的 资源管理和监控,它是 管理插件 rabbitmq_management 提供的功能。通过 HTTP API,你可以不用 rabbitmqctl 就能操作 RabbitMQ。

  • 要使用 HTTP API,你需要在 RabbitMQ 节点上确保 rabbitmq_management 插件已经启动。前面我们介绍web 管理控制台时已经启动了该插件,所以你可以直接使用。

  • 实际上 Web管理控制台 就是通过发送 AJAX 请求到 /api/… 接口来获取数据和执行操作。

  • 这里有 HTTP API 的详细说明,本文不再赘述。