CentOS 7 源码编译安装 RabbitMQ

  • A+
所属分类:RabbitMQ 消息队列

RabbitMQ 是一个开源的消息代理中间件,基于 AMQP(高级消息队列协议)标准实现,用于在分布式系统中实现异步通信和解耦服务。它支持多种消息模式、多语言客户端,并提供可靠的消息传递机制,广泛应用于微服务架构、分布式系统和大数据场景。

核心概念

  1. 消息队列(Queue)
    • 存储消息的缓冲区,生产者(Producer)发送消息到队列,消费者(Consumer)从队列获取消息。
    • 支持多消费者竞争消费,实现负载均衡。
  2. 交换器(Exchange)
    • 接收生产者发送的消息,并根据路由规则(Binding Key)将消息路由到一个或多个队列。
    • 类型包括:直连(Direct)、主题(Topic)、扇形(Fanout)、头模式(Headers)。
  3. 绑定(Binding)
    • 定义交换器与队列之间的关联关系,通过 Binding Key 指定路由规则。
  4. 虚拟主机(Virtual Host)
    • 独立的命名空间,隔离不同用户的资源(交换器、队列等),类似数据库中的 Schema。
  5. 连接(Connection)
    • 客户端与 RabbitMQ 服务器之间的 TCP 连接。
  6. 信道(Channel)
    • 轻量级的连接,复用 TCP 连接,减少资源消耗,客户端通过信道操作 AMQP 命令。

工作模式

RabbitMQ 支持多种消息模式,常见的有:

  1. 简单模式(Simple)
    • 一个生产者对应一个消费者,消息直接发送到队列。
  2. 工作队列模式(Work Queue)
    • 多个消费者竞争消费同一个队列中的消息,适用于负载均衡。
  3. 发布 - 订阅模式(Publish/Subscribe)
    • 生产者将消息发送到扇形交换器(Fanout Exchange),交换器将消息广播到所有绑定的队列。
  4. 路由模式(Routing)
    • 生产者将消息发送到直连交换器(Direct Exchange),根据路由键(Routing Key)和 Binding Key 匹配,将消息路由到对应队列。
  5. 主题模式(Topic)
    • 类似路由模式,但 Binding Key 支持通配符(* 匹配一个单词,# 匹配零个或多个单词)。
  6. RPC 模式
    • 基于消息队列实现远程过程调用,支持同步请求 - 响应。

高可用性与可靠性

  1. 镜像队列(Mirrored Queues)
    • 将队列镜像到多个节点,主节点故障时自动切换到从节点,保证高可用。
  2. 持久化机制
    • 交换器、队列和消息都可设置持久化,确保 RabbitMQ 重启后数据不丢失。
  3. 确认机制
    • 生产者通过 Publisher Confirms 确认消息是否到达交换器。
    • 消费者通过手动确认(Manual Ack)确保消息处理完成后才从队列删除。
  4. 死信队列(Dead Letter Queue)
    • 处理未被消费的消息(如过期、被拒绝且不再重新入队的消息)。

集群与联邦

  1. 集群(Cluster)
    • 多个 RabbitMQ 节点组成集群,共享配置和状态信息,提高吞吐量和可用性。
    • 分为普通集群(Queue 仅存在于创建它的节点)和镜像集群(Queue 复制到多个节点)。
  2. 联邦(Federation)
    • 跨地域、跨数据中心的 RabbitMQ 节点连接,解决广域网环境下的消息传递问题。

性能优化

  • 预取计数(Prefetch Count):控制消费者一次获取的消息数量,避免消费者过载。
  • 持久化策略:权衡性能与可靠性,非关键消息可设置为非持久化。
  • 消息压缩:对大消息进行压缩,减少网络传输开销。
  • 监控工具:使用 RabbitMQ Management 插件、Prometheus + Grafana 监控队列长度、吞吐量等指标。

常见应用场景

  1. 异步处理
    • 将耗时操作(如文件上传、视频转码)放入队列,提高系统响应速度。
  2. 服务解耦
    • 微服务之间通过消息队列通信,降低服务间依赖,提高扩展性。
  3. 流量削峰
    • 在高并发场景下,通过队列缓冲请求,避免后端服务被压垮。
  4. 事件驱动架构
    • 基于消息队列实现事件发布 - 订阅,支持系统扩展和集成。
  5. 数据同步
    • 跨系统数据同步,如用户注册后同步到多个服务。

与其他消息队列对比

特性RabbitMQKafkaRocketMQRedis 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

CentOS 7 源码编译安装 RabbitMQ
CentOS 7 源码编译安装 RabbitMQ
xxx