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 地址即可自动负载
相关推荐
cheems95271 小时前
JWT令牌是如何实现登录认证的
java
happyprince1 小时前
10-Hugging Face Transformers 量化系统深度分析
java·前端·数据库
budingxiaomoli1 小时前
利用Hutool完成验证码案例
java
山人在山上1 小时前
docker离线安装
java·docker·eureka
人间乄惊鸿客1 小时前
c++自记录
java·开发语言·c++
better_liang1 小时前
每日Java面试场景题知识点之-MySQL底层数据结构B+树
java·数据结构·mysql·性能优化·面试题·b+树·数据库索引
蓝影灵1 小时前
单体改微服务记录
java·开发语言
老码观察1 小时前
设计模式实战解读(五):策略模式——干掉 if-else 的优雅方案
java·设计模式·策略模式
李少兄1 小时前
Java 短路求值的优雅实践:用 `&&` 实现安全高效的批量操作控制
java·开发语言