RabbitMQ 的安装及使用
摘要
-
本文介绍 CentOS9 中 RabbitMQ 的安装与使用。
-
本文使用的 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 | ┌─ Broker (RabbitMQ 实例)──────────┐ |
-
RabbitMQ 的典型应用场景
应用场景 | 说明 |
---|---|
异步处理 | 用户请求不直接处理,消息入队后由后台异步消费,例如邮件发送、图片处理 |
削峰填谷 | 缓冲高峰流量,平滑系统压力 |
系统解耦 | 不同服务之间不直接调用,降低耦合 |
广播/通知 | 发布/订阅模式,实现多服务同时收到消息 |
日志收集 | 统一接收、分发日志到不同处理系统 |
RabbitMQ 单机安装
安装Erlang
-
RabbitMQ是基于Erlang语言开发的,所以安装RabbitMQ之前需要安装Erlang语言环境。需要注意的是RabbitMQ与Erlang语言之间是有版本对应关系的。参考官方文档Erlang Version Requirements
-
目前RabbitMQ最新版本是
4.1.4
,Erlang版本可以选择27.x
,GitHub下载地址
1 | # 下载 el9 的版本,对应 CentOS 9 |
安装 RabbitMQ
-
目前RabbitMQ最新版本是
4.1.4
,GitHub下载地址]
1 | # 下载,noarch 表示架构无关,即 X86_64 和 ARM64 都可以 |
RabbitMQ 启动与停止命令
-
Erlang VM 是 Erlang 语言运行环境,RabbitMQ 应用运行在 Erlang VM 下。
-
启动 RabbitMQ 服务(Erlang VM) + 应用
1 | # 启动 RabbitMQ 服务(Erlang VM) + 应用 |
-
停止 RabbitMQ 服务(Erlang VM) + 应用
1 | # 停止 RabbitMQ 服务(Erlang VM) + 应用 |
-
查看RabbitMQ 服务状态
1 | sudo systemctl status rabbitmq-server |
-
RabbitMQ 在 CentOS 9 (RPM 安装) 的目录结构
类型 | 目录路径 | 说明 |
---|---|---|
配置文件 | /etc/rabbitmq |
rabbitmq.conf 、advanced.config 等配置 |
日志文件 | /var/log/rabbitmq |
RabbitMQ 运行日志,默认存放在这里 |
数据目录 | /var/lib/rabbitmq/mnesia |
消息队列、元数据存储目录 |
Erlang Cookie | /var/lib/rabbitmq/.erlang.cookie |
Erlang 节点间通信的 cookie 文件 |
可执行文件 | /usr/lib/rabbitmq/bin |
rabbitmq-server 、rabbitmqctl 等命令 |
启动脚本 | /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 | # 激活插件 |
设置远程访问帐号
-
插件激活后可以通过浏览器访问
http://<ip>:15672
,rabbitmq_management 插件默认用户名和密码都是guest
,但是默认情况下其只能通过127.0.0.1
访问,此时我们有两种方法可以解决
1. 允许 guest
账号远程访问
1 | # 修改 /etc/rabbitmq/rabbitmq.conf 文件 |
-
修改完成后,重启 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_permissions
与set_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 | rabbitmqctl -q --formatter pretty_table list_feature_flags |
-
可以输出 其它 格式,显示更详细的信息
1 | # json |
-
启用所有已标记为 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 位置、数据/日志目录等 |
-
安装后
/etc/rabbitmq/
目录可能是空的,你需要手动创建rabbitmq.conf
,详细的参数说明可以参看官网指南,rabbitmq.conf 示例
1 | # /etc/rabbitmq/rabbitmq.conf |
-
rabbitmq-env.conf
用来 定义节点名、Cookie 、数据/日志目录等的环境变量,RabbitMQ 启动时会自动读取该文件,以下是通过 RPM 安装的 RabbitMQ 的默认值
1 | # /etc/rabbitmq/rabbitmq-env.conf |
-
两个文件的作用
文件 | 作用范围 | 典型参数 | 何时加载 |
---|---|---|---|
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 | _rabbitmqctl_completion() { |
-
实际上 RabbitMQ 的大部分命令都有
autocomplete
参数,都可以自动完成命令参数
1 | # 定义通用补全函数 |
-
测试
1 | # 使补全生效 |
常用命令参数
-
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 的详细说明,本文不再赘述。