本文整合 RabbitMQ 与 Kafka 的核心作用、单节点部署、集群部署、Docker 部署、基础操作,形成一份完整的查阅手册。
一、消息队列是什么 & 核心价值
消息队列(Message Queue,MQ)是分布式系统中的中间件,核心作用是在不同服务 / 系统之间中转、暂存、传递消息,解决服务耦合、流量冲击、异步处理三类核心问题。
核心三大作用
-
系统解耦 上下游系统不直接调用,通过 MQ 作为中间层。例如订单系统下单后,只需向 MQ 发送 "订单创建" 消息,库存、短信、物流等服务各自从 MQ 消费消息处理。某一个下游服务故障,不会影响订单主流程,也不用修改上游代码。
-
异步提速 把耗时操作(如发送短信、生成报表)从主流程剥离。用户下单后,主流程只处理核心逻辑,把异步任务丢给 MQ 就立即返回结果,后台服务慢慢消费执行,大幅降低接口响应时间。
-
削峰填谷 应对秒杀、大促等突发高流量。海量请求先全部涌入 MQ 暂存,后端服务按照自身处理能力匀速消费,避免瞬时流量直接打垮数据库和业务服务,起到流量缓冲的作用。
两款产品的定位差异
- RabbitMQ:传统业务型消息中间件,基于 AMQP 协议,路由功能丰富、消息可靠性高、开箱即用,适合业务系统解耦、任务调度、RPC 回调等企业级场景。
- Kafka:分布式流处理平台,主打超高吞吐量、持久化存储、分区并行,适合日志采集、大数据实时计算、事件溯源、海量数据管道等场景。
二、RabbitMQ 完整部署与使用
2.1 环境与端口说明
- 依赖:Erlang/OTP(RabbitMQ 由 Erlang 语言开发)
- 核心端口:5672(AMQP 客户端通信)、15672(Web 管理界面)、4369(EPMD 节点发现)、25672(集群内部通信)
2.2 单节点部署(Linux RPM 方式)
适用于 RHEL 系系统(AlmaLinux、银河麒麟、CentOS)
1. 配置软件源
# 导入签名密钥
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/rabbitmq-release-signing-key.asc'
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key'
rpm --import 'https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key'
创建仓库文件 /etc/yum.repos.d/rabbitmq.repo:
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/9/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-erlang.E495BB49CC4BBE5B.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
[rabbitmq_server]
name=rabbitmq_server
baseurl=https://packagecloud.io/rabbitmq/rabbitmq-server/el/9/$basearch
repo_gpgcheck=1
gpgcheck=1
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey
https://github.com/rabbitmq/signing-keys/releases/download/3.0/cloudsmith.rabbitmq-server.9F4587F226208342.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
2. 安装并启动服务
# 安装 Erlang 运行环境与 RabbitMQ
dnf install -y erlang rabbitmq-server
# 启动服务并设置开机自启
systemctl enable --now rabbitmq-server
# 启用 Web 管理界面插件
rabbitmq-plugins enable rabbitmq_management
# 防火墙放行端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
3. 创建远程管理员用户
默认 guest 用户仅允许本地访问,需创建可远程登录的管理员:
# 创建用户 admin,密码自定义
rabbitmqctl add_user admin 你的密码
# 设置为管理员角色
rabbitmqctl set_user_tags admin administrator
# 授予默认虚拟主机的全部权限
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
Web 管理地址:http://服务器IP:15672
2.3 3 节点集群部署(高可用)
节点规划
| 主机名 | IP 地址 | 角色 |
|---|---|---|
| mq-01 | 192.168.1.101 | 主节点 |
| mq-02 | 192.168.1.102 | 从节点 |
| mq-03 | 192.168.1.103 | 从节点 |
前置要求:所有节点配置主机名解析、完成 RabbitMQ 安装、放行集群相关端口。
搭建步骤
-
主节点获取认证 Cookie RabbitMQ 集群通过
.erlang.cookie文件做节点认证,所有节点该文件内容必须完全一致。在 mq-01 执行,记录输出的 cookie 字符串
cat /var/lib/rabbitmq/.erlang.cookie
-
从节点同步 Cookie 并加入集群(mq-02、mq-03 分别执行)
先停止 RabbitMQ 服务
systemctl stop rabbitmq-server
替换为主节点的 cookie 值
echo "主节点cookie值" > /var/lib/rabbitmq/.erlang.cookie
修正文件权限(必须为 400,属主 rabbitmq)
chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie启动服务
systemctl start rabbitmq-server
加入主节点集群
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@mq-01
rabbitmqctl start_app -
验证集群状态
rabbitmqctl cluster_status
-
高可用:仲裁队列配置 普通集群消息仅存储在声明队列的单个节点,节点宕机则消息不可用;仲裁队列会在多节点保存消息副本,支持故障自动切换。
创建持久化仲裁队列
rabbitmqadmin declare queue name=ha-queue queue-type=quorum durable=true
查看队列副本分布
rabbitmqctl list_queues name type messages replicas
2.4 Docker 单节点部署
创建 docker-compose.yml:
version: "3.8"
services:
rabbitmq:
image: rabbitmq:3.13-management
container_name: rabbitmq-single
ports:
- "5672:5672"
- "15672:15672"
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=Admin@123
volumes:
- rabbitmq_data:/var/lib/rabbitmq
restart: unless-stopped
volumes:
rabbitmq_data:
启动命令:docker compose up -d
2.5 常用操作命令
# 用户管理
rabbitmqctl list_users # 查看用户列表
rabbitmqctl delete_user guest # 删除默认不安全用户
# 虚拟主机管理
rabbitmqctl add_vhost /myvhost # 创建虚拟主机
rabbitmqctl list_vhosts # 查看虚拟主机列表
# 队列与消息
rabbitmqctl list_queues name messages # 查看所有队列与消息数
rabbitmqadmin purge queue name=test-queue # 清空指定队列
# 运维状态
rabbitmqctl status # 查看服务运行状态
rabbitmqctl list_connections # 查看客户端连接列表
三、Apache Kafka 完整部署与使用
3.1 环境与端口说明
- 依赖:JDK 17+
- 核心端口:9092(客户端通信)、9093(KRaft 控制器内部通信)
- 架构:采用官方推荐的 KRaft 模式,无需依赖 ZooKeeper,部署更轻量
3.2 单节点部署(KRaft 模式)
1. 安装 JDK 17
dnf install -y java-17-openjdk java-17-openjdk-devel
java -version
2. 下载并解压 Kafka
mkdir -p /opt/kafka && cd /opt
wget https://downloads.apache.org/kafka/3.9.1/kafka_2.13-3.9.1.tgz
tar -xzf kafka_2.13-3.9.1.tgz
mv kafka_2.13-3.9.1/* /opt/kafka/
3. 配置与初始化
生成集群唯一 ID:
KAFKA_CLUSTER_ID=$(/opt/kafka/bin/kafka-storage.sh random-uuid)
echo $KAFKA_CLUSTER_ID
编辑配置文件 /opt/kafka/config/kraft/server.properties:
node.id=1
process.roles=broker,controller
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
advertised.listeners=PLAINTEXT://你的服务器IP:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
controller.quorum.voters=1@localhost:9093
log.dirs=/opt/kafka/data
num.partitions=3
offsets.topic.replication.factor=1
transaction.state.log.replication.factor=1
delete.topic.enable=true
格式化存储目录:
/opt/kafka/bin/kafka-storage.sh format -t $KAFKA_CLUSTER_ID -c /opt/kafka/config/kraft/server.properties
4. 配置系统服务并启动
创建 systemd 服务文件 /etc/systemd/system/kafka.service:
[Unit]
Description=Apache Kafka (KRaft mode)
After=network.target
[Service]
Type=simple
Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk"
ExecStart=/opt/kafka/bin/kafka-server-start.sh /opt/kafka/config/kraft/server.properties
ExecStop=/opt/kafka/bin/kafka-server-stop.sh
Restart=on-failure
[Install]
WantedBy=multi-user.target
启动并设置开机自启:
systemctl daemon-reload
systemctl enable --now kafka
systemctl status kafka
3.3 3 节点集群部署(KRaft 模式)
节点规划
| 节点 ID | IP 地址 | 角色 |
|---|---|---|
| 1 | 192.168.1.101 | Broker + Controller |
| 2 | 192.168.1.102 | Broker + Controller |
| 3 | 192.168.1.103 | Broker + Controller |
搭建步骤
-
所有节点完成 JDK 安装、Kafka 解压。
-
在任意节点生成统一集群 ID,三个节点必须使用同一个 ID。
-
逐节点修改配置文件,核心差异为
node.id和advertised.listeners:以节点1为例,节点2、3对应修改 node.id 和 IP
node.id=1
process.roles=broker,controller
listeners=PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
advertised.listeners=PLAINTEXT://192.168.1.101:9092
controller.listener.names=CONTROLLER
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT三个节点全部写入仲裁列表
controller.quorum.voters=1@192.168.1.101:9093,2@192.168.1.102:9093,3@192.168.1.103:9093
log.dirs=/opt/kafka/data
num.partitions=3
offsets.topic.replication.factor=3
transaction.state.log.replication.factor=3
transaction.state.log.min.isr=2
delete.topic.enable=true -
所有节点格式化存储并启动服务:
/opt/kafka/bin/kafka-storage.sh format -t 统一集群ID -c /opt/kafka/config/kraft/server.properties
systemctl enable --now kafka -
验证集群可用性:
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server 192.168.1.101:9092,192.168.1.102:9092,192.168.1.103:9092
3.4 Docker 单节点部署
创建 docker-compose.yml:
version: "3.8"
services:
kafka:
image: bitnami/kafka:3.9
container_name: kafka-single
ports:
- "9092:9092"
environment:
- KAFKA_CFG_NODE_ID=1
- KAFKA_CFG_PROCESS_ROLES=broker,controller
- KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=1@kafka:9093
- KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093
- KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://宿主机IP:9092
- KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER
- KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
- KAFKA_CFG_OFFSETS_TOPIC_REPLICATION_FACTOR=1
- ALLOW_PLAINTEXT_LISTENER=yes
volumes:
- kafka_data:/bitnami/kafka
restart: unless-stopped
volumes:
kafka_data:
启动命令:docker compose up -d
3.5 常用操作命令
# 创建主题(3分区、单副本)
/opt/kafka/bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 3 --topic test-topic
# 查看所有主题
/opt/kafka/bin/kafka-topics.sh --list --bootstrap-server localhost:9092
# 查看主题详情(分区、副本分布)
/opt/kafka/bin/kafka-topics.sh --describe --bootstrap-server localhost:9092 --topic test-topic
# 控制台生产消息(输入内容回车发送)
/opt/kafka/bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-topic
# 控制台消费消息(从头消费历史消息)
/opt/kafka/bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test-topic --from-beginning
# 删除主题
/opt/kafka/bin/kafka-topics.sh --delete --bootstrap-server localhost:9092 --topic test-topic
四、核心对比与选型指南
| 对比维度 | RabbitMQ | Kafka |
|---|---|---|
| 核心定位 | 业务级消息中间件 | 分布式流处理平台 |
| 通信协议 | AMQP、MQTT、STOMP 等多协议 | 自定义二进制 TCP 协议 |
| 消息模型 | 交换机 - 队列模型,路由能力极强 | 分区日志模型,基于拉模式消费 |
| 单节点吞吐量 | 万级 / 秒,中等 | 百万级 / 秒,极高 |
| 消息可靠性 | 支持事务、确认机制,可靠性极高 | 默认至少一次投递,可配置精确一次 |
| 消息顺序 | 单队列内有序 | 单分区内严格有序 |
| 运维复杂度 | 低,开箱即用 | 高,需管理分区、副本、集群均衡 |
| 典型场景 | 业务解耦、订单通知、任务调度 | 日志采集、实时大数据、事件溯源 |
选型建议
- 业务系统内部解耦、需要复杂路由规则、优先保证消息可靠投递 → 选 RabbitMQ
- 海量数据传输、日志埋点、实时流计算、追求极致吞吐量 → 选 Kafka
五、生产环境通用注意事项
RabbitMQ
- 建议 3 节点及以上奇数节点集群,使用仲裁队列保证数据高可用
- 配置内存阈值与磁盘水位线告警,避免服务因资源耗尽挂起
- 关闭默认
guest用户,按业务划分虚拟主机与最小权限用户
Kafka
- 生产集群建议至少 3 节点,副本因子设为 3,
min.insync.replicas设为 2 - 数据目录使用独立高性能磁盘,避免与系统盘混用
- 开启 JMX 监控,配合 Prometheus + Grafana 监控分区、消费滞后量等核心指标