Java 生产环境 RocketMQ 架构与部署指南

目录

一、生产环境标准架构(必用)

[1. 整体架构图(极简版)](#1. 整体架构图(极简版))

[2. 核心组件说明](#2. 核心组件说明)

二、生产环境推荐部署规格

最小高可用集群(最常用)

中型集群(业务量较大)

三、部署步骤(生产可直接照做)

环境准备

[步骤 1:下载解压](#步骤 1:下载解压)

[步骤 2:修改 JVM 内存(非常重要)](#步骤 2:修改 JVM 内存(非常重要))

[步骤 3:配置 NameServer 集群(2 台)](#步骤 3:配置 NameServer 集群(2 台))

[步骤 4:配置 Broker 主从集群(核心)](#步骤 4:配置 Broker 主从集群(核心))

机器规划

[1)配置 broker1-master](#1)配置 broker1-master)

[2)配置 broker1-slave](#2)配置 broker1-slave)

[3)broker2-master 和 broker2-slave](#3)broker2-master 和 broker2-slave)

[四、Java 生产环境客户端配置](#四、Java 生产环境客户端配置)

生产者

消费者

五、生产环境关键配置(必看)

六、集群检查命令

七、高可用保障机制

总结


RocketMQ 是阿里开源的分布式消息队列,生产环境必须用分布式高可用架构 ,绝对不能单节点部署。本文会用最清晰、生产可直接落地的方式,给你讲透架构部署步骤


一、生产环境标准架构(必用)

生产环境核心目标:高可用、无单点故障、可水平扩容

1. 整体架构图(极简版)

复制代码
生产者集群 → NameServer 集群(2~3台) → Broker 主从集群 → 消费者集群

2. 核心组件说明

  1. NameServer(注册中心)

    • 轻量级无状态服务,必须集群部署(2~3 台)
    • 作用:Broker 注册、路由发现、心跳检测
    • 无主从、无选举,随便挂一台不影响整体
  2. Broker(消息存储核心)

    • 真正负责消息收发、持久化、高可用
    • 生产必须:主从架构(Master-Slave)
    • 支持异步刷盘 + 异步复制(性能最高)
    • 支持同步双写(金融级可靠性)
  3. 生产者 / 消费者

    • 都是客户端集群,无状态,可随意扩容
    • 通过 NameServer 自动发现 Broker

二、生产环境推荐部署规格

最小高可用集群(最常用)

  • NameServer:2 台(2C4G)
  • Broker :2 主 2 从(4 台,4C8G+SSD)
    • broker1-master + broker1-slave
    • broker2-master + broker2-slave

中型集群(业务量较大)

  • NameServer:3 台
  • Broker:3 主 3 从(6 台)

磁盘必须用 SSD,机械盘会导致严重性能瓶颈。


三、部署步骤(生产可直接照做)

环境准备

  • Linux(CentOS 7+/Ubuntu 20+)
  • JDK 8+(必须)
  • 关闭防火墙 / 开放端口:9876 (NameServer)、10911/10912 (Broker)
  • 磁盘:SSD,预留 50GB+

步骤 1:下载解压

复制代码
# 下载稳定版 4.9.5 / 5.1.0(生产推荐 4.9.x)
wget https://archive.apache.org/dist/rocketmq/4.9.5/rocketmq-all-4.9.5-bin-release.zip

unzip rocketmq-all-4.9.5-bin-release.zip
mv rocketmq-4.9.5 /usr/local/rocketmq
cd /usr/local/rocketmq

步骤 2:修改 JVM 内存(非常重要)

默认内存太大,服务器会直接挂!

  1. 修改 NameServer 启动内存

    vim bin/runserver.sh

找到:

复制代码
JAVA_OPT="${JAVA_OPT} -server -Xms4g -Xmx4g -Xmn2g"

改为:

复制代码
JAVA_OPT="${JAVA_OPT} -server -Xms512m -Xmx512m -Xmn256m"
  1. 修改 Broker 启动内存

    vim bin/runbroker.sh

找到:

复制代码
JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g"

改为:

复制代码
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g"

步骤 3:配置 NameServer 集群(2 台)

每台 NameServer 都执行:

复制代码
nohup sh bin/mqnamesrv &

# 查看日志
tail -f ~/logs/rocketmqlogs/namesrv.log

看到:

复制代码
The Name Server boot success

即启动成功。


步骤 4:配置 Broker 主从集群(核心)

我们以 2 主 2 从 为例:

机器规划
  • 192.168.1.10:broker1-master
  • 192.168.1.11:broker1-slave
  • 192.168.1.12:broker2-master
  • 192.168.1.13:broker2-slave
  • NameServer:192.168.1.20, 192.168.1.21

1)配置 broker1-master
复制代码
mkdir -p /data/rocketmq/store
mkdir -p /data/rocketmq/logs

vim conf/broker.conf

写入:

properties

复制代码
brokerClusterName = DefaultCluster
brokerName = broker1
brokerId = 0              # 0=master
deleteWhen = 04
fileReservedTime = 48
brokerRole = ASYNC_MASTER # 异步主(高性能)
flushDiskType = ASYNC_FLUSH # 异步刷盘

listenPort=10911
namesrvAddr=192.168.1.20:9876;192.168.1.21:9876

storePathRootDir=/data/rocketmq/store
storePathCommitLog=/data/rocketmq/store/commitlog
storePathConsumeQueue=/data/rocketmq/store/consumequeue
storePathIndex=/data/rocketmq/store/index
storeCheckpoint=/data/rocketmq/store/checkpoint
abortFile=/data/rocketmq/store/abort

启动:

复制代码
nohup sh bin/mqbroker -c conf/broker.conf &

2)配置 broker1-slave

properties

复制代码
brokerClusterName = DefaultCluster
brokerName = broker1
brokerId = 1              # 非0=slave
deleteWhen = 04
fileReservedTime = 48
brokerRole = SLAVE        # 从节点
flushDiskType = ASYNC_FLUSH

listenPort=10911
namesrvAddr=192.168.1.20:9876;192.168.1.21:9876

storePathRootDir=/data/rocketmq/store
...

3)broker2-master 和 broker2-slave
  • brokerName = broker2
  • brokerId=0/master,brokerId=1/slave
  • 其他完全一样

四、Java 生产环境客户端配置

生产者

复制代码
@Bean
public DefaultMQProducer producer() {
    DefaultMQProducer producer = new DefaultMQProducer("ProducerGroup");
    // 填所有 NameServer
    producer.setNamesrvAddr("192.168.1.20:9876;192.168.1.21:9876");
    producer.setRetryTimesWhenSendFailed(2);
    producer.setSendMsgTimeout(3000);
    return producer;
}

消费者

复制代码
@Bean
public DefaultMQPushConsumer consumer() throws MQClientException {
    DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("ConsumerGroup");
    consumer.setNamesrvAddr("192.168.1.20:9876;192.168.1.21:9876");
    consumer.subscribe("TOPIC_TEST", "*");
    consumer.setMessageListener(new MessageListenerConcurrently() {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(...) {
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    });
    return consumer;
}

五、生产环境关键配置(必看)

  1. brokerRole = ASYNC_MASTER(高性能)
  2. flushDiskType = ASYNC_FLUSH(高性能)
  3. 金融级可用:
    • brokerRole = SYNC_MASTER
    • flushDiskType = SYNC_FLUSH
  4. 磁盘保留 48 小时
  5. 开启自动删除过期文件

六、集群检查命令

复制代码
# 查看集群状态
sh bin/mqadmin clusterList -n 192.168.1.20:9876

# 查看 Topic 路由
sh bin/mqadmin topicRoute -n 192.168.1.20:9876 -t TOPIC_TEST

七、高可用保障机制

  • NameServer 集群 → 无单点
  • Broker 主从 → Master 挂了,Slave 自动升主(RocketMQ 4.x 需要手动切换;5.x 自动切换)
  • 生产者 / 消费者自动重试、自动发现
  • 消息持久化到磁盘

总结

  • 生产架构:NameServer 集群(2~3 台) + Broker 主从集群(2 主 2 从起步)
  • 部署核心:修改 JVM 内存 + 配置 broker.conf 主从 + 用 SSD
  • 高可用:无单点、主从自动切换、消息不丢失
  • Java 客户端:配置所有 NameServer 地址即可自动负载
相关推荐
IT枫斗者枫哥6 分钟前
Java 文件导出:写完了,为什么还不能标记成功?
java
陈皮波比茶12 分钟前
java笔记-typora快捷键
java
蚂蚁雅嘿21 分钟前
maven标签日常总结
java·maven
洋不写bug32 分钟前
二叉树(二) 常见基础操作解析|结点数、树高、查找结点、判断完全二叉树
java·开发语言·数据结构·完全二叉树·二叉树结点数·树高·查找结点
菠萝加点糖43 分钟前
Maven 坐标系统说明
java·maven
hm宋1 小时前
Canal 升级 jar 包操作文档(以升级 FastJSON 为例)
java·canal·jar
后台模板学习1 小时前
学习的心态高频面试题
java·数据库·学习
用户3126874877201 小时前
线程池到底怎么管理线程的?从 ThreadPoolExecutor 到拒绝策略全链路拆解
java
cpolar技术支持2 小时前
Kafka Streams 窗口统计怎么验收:本地跑订单流聚合,用 cpolar 给同事看只读结果页
java·docker·kafka·cpolar·kafka streams
爱读源码的大都督2 小时前
DeepSeek面试官问:生产RAG系统回答不准确,该如何定位和优化?这样回答,能让面试官当场给你Offer!
java·后端·python