RabbitMQ 入门与安装:从 MQ 概念到环境搭建
一、开篇:学习 RabbitMQ 前需要准备什么
RabbitMQ 属于消息中间件,是 Java 后端开发中非常常见的一类基础组件。学习它之前,最好已经具备以下基础:
- 具备一定 Java 基础;
- 掌握 Spring Boot 的基本使用;
- 了解 Linux 常见命令;
- 本地或服务器环境中准备好 JDK 17;
- 有一台 Linux 服务器,Ubuntu 或 CentOS 都可以。
从后端面试和实际项目角度看,MQ 并不是一个孤立知识点。它经常和分布式系统、异步任务、削峰填谷、系统解耦、订单超时处理、消息可靠性等场景一起出现。因此,学习 RabbitMQ 不只是为了会写几行收发消息的代码,更重要的是理解:为什么系统需要消息队列,以及消息队列在架构中解决了什么问题。
二、RabbitMQ 概述
RabbitMQ 是一个实现了 AMQP 协议的消息队列服务,也是目前主流的消息中间件之一。
AMQP,全称是 Advanced Message Queuing Protocol,即高级消息队列协议。它是一个面向消息中间件设计的应用层协议,目标是提供统一的消息传递规范。基于 AMQP,客户端和消息中间件之间可以传递消息,并且不强绑定具体开发语言或具体中间件实现。
RabbitMQ 使用 Erlang 语言开发,最初起源于金融系统领域,用来在分布式系统中存储和转发消息。它后来逐渐走向开源和大众化,在易用性、扩展性、可靠性、高可用性等方面都有比较成熟的表现。
三、什么是 MQ
MQ 是 Message Queue 的缩写,直译就是消息队列。
从字面上理解,它本质上是一个队列,符合 FIFO,也就是先进先出的特点。只不过,队列里存放的不是普通数据结构里的元素,而是一条条消息。消息可以很简单,比如字符串、JSON;也可以比较复杂,比如包含业务对象、状态、事件类型等结构化内容。
在分布式系统中,系统之间的调用通常可以分成两类:
-
同步通信
一个系统直接调用另一个系统的服务,请求发出后需要等待对方处理并返回结果。比如 A 系统调用 B 系统接口,B 系统返回结果后,A 系统才能继续往下执行。
-
异步通信
一个系统把数据先发送到某个中间容器中,另一个系统在合适的时机再从这个容器中取出并处理。MQ 就是这个"中间容器"的典型实现。
RabbitMQ 就是 MQ 的一种具体实现。
四、MQ 的核心作用
MQ 的主要工作是接收消息、存储消息、转发消息。不同业务场景下,它能发挥不同作用。
可以把 MQ 想象成一个仓库。采购部门把零件放进仓库,生产部门从仓库取出零件加工成产品。仓库存储和转交的是物品,而 MQ 存储和转交的是消息。
1. 异步解耦
在业务流程中,有些操作比较耗时,但不一定需要立刻完成。
例如用户注册成功后,系统可能还需要发送短信、发送邮件、初始化积分账户等。如果所有操作都同步执行,用户就必须等这些流程全部结束后才能看到"注册成功"。这会拉长响应时间,也会让主流程依赖多个外部服务。
引入 MQ 后,注册服务可以先完成核心注册逻辑,然后向 MQ 投递一条"用户已注册"的消息。短信服务、邮件服务再异步消费这条消息。这样主流程更轻,系统之间的耦合也更低。
2. 流量削峰
秒杀、促销、抢购这类场景下,短时间内可能涌入大量请求。如果后端服务直接承接所有流量,很容易把数据库或业务服务打崩。
使用 MQ 后,请求可以先进入队列排队,后端服务再按照自身处理能力逐步消费。这样可以把瞬时高峰变成相对平缓的处理过程,降低系统被突发流量压垮的风险。
3. 消息分发
当多个系统都需要对同一件事情做出响应时,MQ 可以充当消息分发中心。
例如支付成功后,订单系统需要修改订单状态,积分系统需要增加积分,库存系统需要扣减库存,通知系统需要发送消息。如果支付系统直接调用这些系统,就会越来越复杂。更好的方式是:支付系统只向 MQ 投递一条"支付成功"消息,其他系统订阅并处理自己关心的逻辑。
4. 延迟通知
有些业务需要在一段时间之后再执行。
例如电商平台中,用户下单后如果一定时间内没有支付,系统需要自动取消订单。这个场景可以借助延迟消息或延迟队列实现:下单时发送一条延迟消息,到期后检查订单状态,如果仍未支付,就执行取消操作。
五、为什么选择 RabbitMQ
业界常见的 MQ 产品有 RabbitMQ、RocketMQ、Kafka、ActiveMQ、ZeroMQ 等,也有一些场景会直接使用 Redis 充当轻量消息队列。
这些产品没有绝对的好坏,只有适不适合业务场景。
Kafka
Kafka 最初主要面向日志收集和传输,追求高吞吐量,性能非常强,单机吞吐量可以达到很高水平。它在日志采集、流式数据处理等领域非常成熟。
如果核心需求是日志采集、大数据链路或高吞吐消息流,Kafka 往往是优先选择。
RocketMQ
RocketMQ 使用 Java 开发,由阿里巴巴开源,后来捐赠给 Apache。它借鉴了 Kafka 的设计,并针对高可用、可靠性、稳定性做了很多增强,经过大规模业务场景验证。
如果系统对消息可靠性要求高,同时并发量较大,例如互联网金融、大型交易系统等,RocketMQ 是很有竞争力的选择。
RabbitMQ
RabbitMQ 使用 Erlang 开发,功能比较完整,支持几乎所有主流语言,管理界面友好,社区活跃度较高,吞吐能力也能满足很多中小型业务系统。
对于数据量不是极端庞大、并发不是特别夸张、又希望快速上手并使用成熟管理界面的项目来说,RabbitMQ 是一个综合能力很强的选择。
六、RabbitMQ 安装
RabbitMQ 的安装方式有多种。课件中主要介绍了 Ubuntu 安装、CentOS 安装、Docker 安装,以及一些常见服务操作。
在安装 RabbitMQ 前,要注意一个关键点:RabbitMQ 依赖 Erlang 环境,因此安装 RabbitMQ 前需要先安装 Erlang,并且 Erlang 版本需要和 RabbitMQ 版本匹配。
1. Ubuntu 环境安装
Ubuntu 标准仓库中已经包含 RabbitMQ,但仓库版本可能比 RabbitMQ 官方最新版本落后。学习阶段可以先使用 Ubuntu 仓库版本快速安装。
安装 Erlang
bash
sudo apt-get update
sudo apt-get install erlang
查看 Erlang 是否安装成功:
bash
erl
进入 Erlang Shell 后,可以使用下面命令退出:
erlang
halt().
安装 RabbitMQ
bash
sudo apt-get update
sudo apt-get install rabbitmq-server
systemctl status rabbitmq-server
如果状态中显示 active (running),说明 RabbitMQ 服务已经正常运行。
启用管理界面
RabbitMQ 默认不会开启 Web 管理界面,需要手动启用插件:
bash
rabbitmq-plugins enable rabbitmq_management
启用成功后,默认管理端口是 15672,浏览器访问:
text
http://服务器IP:15672/
需要注意:云服务器要在安全组或防火墙中放行 15672 端口。RabbitMQ 从 3.3.0 开始限制 guest/guest 用户只能从 localhost 登录,因此远程访问时建议创建新的管理员用户。
添加管理员用户
bash
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
这里创建了用户名为 admin、密码为 admin 的用户,并授予 administrator 管理员角色。实际生产环境中,不建议使用过于简单的密码。
2. CentOS 环境安装
CentOS 安装方式通常使用 rpm 包。安装前可以先确认系统版本:
bash
cat /etc/redhat-release
安装 Erlang
可以从 RabbitMQ 官方推荐的 packagecloud 仓库下载 Erlang rpm 包。下载时要注意系统版本,例如 el7 对应 CentOS 7,el8 对应 CentOS 8。
安装示例:
bash
yum localinstall erlang-23.3.4.11-1.el7.x86_64.rpm
安装完成后验证:
bash
erl
安装 RabbitMQ
同样先下载匹配版本的 RabbitMQ Server rpm 包,然后导入签名密钥并安装:
bash
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum localinstall rabbitmq-server-3.8.30-1.el7.noarch.rpm
启用管理界面并启动服务
bash
rabbitmq-plugins enable rabbitmq_management
service rabbitmq-server start
service rabbitmq-server status
访问管理界面:
text
http://服务器IP:15672/
同样建议创建管理员用户:
bash
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
3. Docker 安装
如果只是学习和本地测试,Docker 是非常方便的方式。推荐直接使用带管理界面的镜像版本:
bash
docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
docker ps
这里有两个重要端口:
5672:RabbitMQ 客户端通信端口,应用程序连接 RabbitMQ 时通常使用它;15672:RabbitMQ Web 管理界面端口。
启动后访问:
text
http://服务器IP:15672/
Docker 方式下,可以进入容器内部创建管理员用户:
bash
docker exec -it 容器ID /bin/bash
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
七、常见服务操作
Ubuntu 常用命令
bash
sudo systemctl start rabbitmq-server
sudo systemctl stop rabbitmq-server
sudo systemctl restart rabbitmq-server
sudo systemctl enable rabbitmq-server
sudo systemctl status rabbitmq-server
CentOS 常用命令
bash
service rabbitmq-server start
sudo systemctl stop rabbitmq-server
service rabbitmq-server restart
chkconfig rabbitmq-server on
修改默认端口
RabbitMQ 默认客户端端口是 5672,管理界面端口是 15672。如果需要修改,可以在 /etc/rabbitmq/rabbitmq.conf 中添加类似配置:
properties
listeners.tcp.default=8942
management.tcp.port=8943
然后重启 RabbitMQ 服务:
bash
sudo systemctl restart rabbitmq-server
或者在 CentOS 中:
bash
sudo service rabbitmq-server restart
八、卸载 RabbitMQ
如果需要重新安装,可以先卸载旧版本。
Ubuntu 卸载
bash
sudo systemctl stop rabbitmq-server
dpkg -l | grep rabbitmq
sudo apt-get purge --auto-remove rabbitmq-server
dpkg -l | grep erlang
sudo apt-get purge --auto-remove erlang
CentOS 卸载
bash
service rabbitmq-server stop
yum list | grep rabbitmq
yum -y remove rabbitmq-server.noarch
rm -rf /var/lib/rabbitmq/
rm -rf /usr/local/rabbitmq
yum list | grep erlang
yum -y remove erlang.x86_64
卸载时要谨慎执行删除命令,特别是 /var/lib/rabbitmq/ 目录中可能包含 RabbitMQ 的持久化数据。
九、小结
RabbitMQ 的学习可以分成三步:
- 先理解 MQ 解决的问题:异步解耦、流量削峰、消息分发、延迟通知;
- 再理解 RabbitMQ 的定位:它是实现 AMQP 协议的成熟消息中间件,功能完整、管理界面友好、社区成熟;
- 最后把环境跑起来:先装 Erlang,再装 RabbitMQ,开启管理插件,创建管理员用户,并确认
5672和15672两个端口可用。
掌握这些内容后,就可以继续学习 RabbitMQ 的核心模型,例如生产者、消费者、交换机、队列、绑定关系、消息确认机制等。真正理解这些概念之后,RabbitMQ 就不再只是一个"会安装的软件",而会变成分布式系统里非常实用的一块基础设施。