消息队列(MQ)总览:RabbitMQ & Kafka 完整手册

本文整合 RabbitMQ 与 Kafka 的核心作用、单节点部署、集群部署、Docker 部署、基础操作,形成一份完整的查阅手册。


一、消息队列是什么 & 核心价值

消息队列(Message Queue,MQ)是分布式系统中的中间件,核心作用是在不同服务 / 系统之间中转、暂存、传递消息,解决服务耦合、流量冲击、异步处理三类核心问题。

核心三大作用

  1. 系统解耦 上下游系统不直接调用,通过 MQ 作为中间层。例如订单系统下单后,只需向 MQ 发送 "订单创建" 消息,库存、短信、物流等服务各自从 MQ 消费消息处理。某一个下游服务故障,不会影响订单主流程,也不用修改上游代码。

  2. 异步提速 把耗时操作(如发送短信、生成报表)从主流程剥离。用户下单后,主流程只处理核心逻辑,把异步任务丢给 MQ 就立即返回结果,后台服务慢慢消费执行,大幅降低接口响应时间。

  3. 削峰填谷 应对秒杀、大促等突发高流量。海量请求先全部涌入 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 安装、放行集群相关端口。

搭建步骤
  1. 主节点获取认证 Cookie RabbitMQ 集群通过 .erlang.cookie 文件做节点认证,所有节点该文件内容必须完全一致。

    在 mq-01 执行,记录输出的 cookie 字符串

    cat /var/lib/rabbitmq/.erlang.cookie

  2. 从节点同步 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

  3. 验证集群状态

    rabbitmqctl cluster_status

  4. 高可用:仲裁队列配置 普通集群消息仅存储在声明队列的单个节点,节点宕机则消息不可用;仲裁队列会在多节点保存消息副本,支持故障自动切换。

    创建持久化仲裁队列

    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
搭建步骤
  1. 所有节点完成 JDK 安装、Kafka 解压。

  2. 在任意节点生成统一集群 ID,三个节点必须使用同一个 ID。

  3. 逐节点修改配置文件,核心差异为 node.idadvertised.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

  4. 所有节点格式化存储并启动服务:

    /opt/kafka/bin/kafka-storage.sh format -t 统一集群ID -c /opt/kafka/config/kraft/server.properties
    systemctl enable --now kafka

  5. 验证集群可用性:

    /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 监控分区、消费滞后量等核心指标
相关推荐
重庆小透明13 小时前
带你从不同视角了解三大MQ
java·学习·spring·kafka·rabbitmq·rocketmq
珠***格14 小时前
分布式光伏电站:四可装置如何实现 “可观、可测、可控、可调”
网络·人工智能·分布式·架构·能源
晚安code16 小时前
RabbitMQ消息可靠性:发送确认、消费者ACK与SpringAMQP实战
rabbitmq
fīɡЙtīиɡ ℡19 小时前
分布式ID生成策略
java·分布式·算法
肥胖小羊21 小时前
企业微信应用的 Token 缓存策略与分布式锁高可用设计
分布式·缓存·企业微信
栩栩云生1 天前
被抹去的 27 秒:你的代码,其实并不活在真实的时间里
分布式·unix
流烟默1 天前
分布式限流三种方案详解
分布式·网关限流
January丶1 天前
docker-compose安装Kafka集群
kafka
刘小八1 天前
RabbitMQ 消息积压排查:从指标定位到消费者扩容
分布式·rabbitmq