RabbitMQ 入门与安装

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;也可以比较复杂,比如包含业务对象、状态、事件类型等结构化内容。

在分布式系统中,系统之间的调用通常可以分成两类:

  1. 同步通信

    一个系统直接调用另一个系统的服务,请求发出后需要等待对方处理并返回结果。比如 A 系统调用 B 系统接口,B 系统返回结果后,A 系统才能继续往下执行。

  2. 异步通信

    一个系统把数据先发送到某个中间容器中,另一个系统在合适的时机再从这个容器中取出并处理。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 的学习可以分成三步:

  1. 先理解 MQ 解决的问题:异步解耦、流量削峰、消息分发、延迟通知;
  2. 再理解 RabbitMQ 的定位:它是实现 AMQP 协议的成熟消息中间件,功能完整、管理界面友好、社区成熟;
  3. 最后把环境跑起来:先装 Erlang,再装 RabbitMQ,开启管理插件,创建管理员用户,并确认 567215672 两个端口可用。

掌握这些内容后,就可以继续学习 RabbitMQ 的核心模型,例如生产者、消费者、交换机、队列、绑定关系、消息确认机制等。真正理解这些概念之后,RabbitMQ 就不再只是一个"会安装的软件",而会变成分布式系统里非常实用的一块基础设施。

相关推荐
阿坤带你走近大数据1 小时前
Kafka的基本概念,基本用法及常见使用场景
分布式·kafka
逻极1 小时前
RabbitMQ 从入门到精通:构建高可用、高性能的消息中间件系统
分布式·rabbitmq·消息中间件
Lyyaoo.1 小时前
Kafka快速入门
分布式·kafka
懂AI的老郑2 小时前
OpenClaw:高效管理分布式Agent开发团队
分布式·ai编程
来自星星的谢广坤2 小时前
OpenClaw做分布式合适吗?
分布式·openclaw
元拓数智12 小时前
智能分析落地卡壳?先补好「数据关系+语义治理」这层技术基建
大数据·分布式·ai·spark·数据关系·语义治理
GIS数据转换器17 小时前
农村生活污水治理智慧管控平台
大数据·人工智能·分布式·数据分析·生活·智慧城市
Trouvaille ~18 小时前
【Redis篇】初识 Redis:特性、应用场景与版本演进
数据结构·数据库·redis·分布式·缓存·中间件·持久化
米高梅狮子20 小时前
Ceph 分布式存储 部署
linux·运维·数据库·分布式·ceph·docker·华为云