feat(infra): RocketMQ 5.3.1 自托管 mini-infra(NameServer+单 Broker+lean 1g JVM)(切片一 阶段〇 B2)

纯增量、host 网络、brokerIP1 指 Tailscale 地址;探针绿、Broker 注册成功、内存在 lean 预算内。
端点写回 docs/内网凭据与端点.md。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
lili 2026-07-01 08:55:59 -07:00
parent 38dd2dc4e5
commit 22b3016048
5 changed files with 135 additions and 0 deletions

2
deploy/infra/rocketmq/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
# 容器运行时产物(Broker CommitLog / ConsumeQueue / 日志),不入仓。
data/

View File

@ -0,0 +1,32 @@
# =============================================================================
# RocketMQ Broker 配置 —— 单机 Master、自动建 topic(MVP)(切片一 阶段〇 B2)
# -----------------------------------------------------------------------------
# 配置控制面设计 §3.7:RocketMQ 承载异步生成队列(gen 队列 topic = AIGC_GEN_TOPIC),
# game-cloud(C3)在其上做生产 / 消费。单机自托管在 mini-infra,与 NameServer 同机、
# host 网络。
#
# 存储路径用镜像默认 ${user.home}/store = /home/rocketmq/store(compose 已把它挂到
# 宿主 ./data/store);日志同理落 /home/rocketmq/logs → ./data/logs。故此处不再显式
# 设 storePathRootDir,保持与默认一致、少一处漂移。
# =============================================================================
brokerClusterName = DefaultCluster
brokerName = broker-a
brokerId = 0
# 磁盘回收:凌晨 4 点清过期 CommitLog;文件保留 48 小时。
deleteWhen = 04
fileReservedTime = 48
# 单机异步:主从复制走异步、刷盘走异步(MVP 单 Master、无从节点,吞吐优先)。
brokerRole = ASYNC_MASTER
flushDiskType = ASYNC_FLUSH
# 关键坑:brokerIP1 必须是消费方(game-cloud / mini-desktop)真正连得到的地址。
# NameServer 只是把 broker 上报的这个地址原样返回给客户端;若留空会取容器识别到的
# 本机地址,跨机客户端据此连 broker 会失败。故显式钉死为 mini-infra 的 Tailscale 地址。
brokerIP1 = 100.64.0.8
# MVP 阶段允许生产端首发消息时自动建 topic / 订阅组,省去预建 AIGC_GEN_TOPIC 的一步。
# 生产强化期可关掉、改为显式建 topic 管控分片与权限。
autoCreateTopicEnable = true
autoCreateSubscriptionGroup = true

View File

@ -0,0 +1,44 @@
# =============================================================================
# RocketMQ 5.3.1 自托管 —— NameServer + 单 Broker + lean JVM(切片一 阶段〇 B2)
# -----------------------------------------------------------------------------
# 配置控制面设计 §3.7:game-cloud 是 Spring Cloud Alibaba,RocketMQ 是其原生异步
# 消息基建,承载异步生成队列(topic = AIGC_GEN_TOPIC)。自托管在 mini-infra,纯增量,
# 不动既有容器。
#
# 三条部署纪律都编进了这里:
# - lean JVM:该镜像 broker 默认 -Xmx2g、nameserver 默认 -Xmx1g;mini-infra 内存要
# 留给既有 MySQL / RAGflow / new-api,故经 JAVA_OPT_EXT 压到 broker 1g、namesrv 512m。
# JAVA_OPT_EXT 在 runbroker.sh / runserver.sh 里拼在默认 HEAP_OPTS 之后,JVM 取最后
# 一个 -Xmx,故覆盖生效(实测确认)。broker 带 AlwaysPreTouch,启动即提交约 1g 常驻。
# - network_mode: host:与既有 infra-* 容器一致。NameServer 占 9876,Broker 占 10911
# (+ 10909 HA、10912 fast)三个 host 端口,均未被既有容器占用。
# - brokerIP1:在 broker.conf 里钉死 100.64.0.8,保证跨机客户端拿到可达的 broker 地址。
#
# 存储 / 日志落宿主 ./data(见 .gitignore,不入仓)。⚠️ 容器以 uid=3000(rocketmq)运行,
# 部署前必须先在宿主建好 data/store、data/logs 并 chown 3000:3000,否则 broker 无权写
# CommitLog、起不来。这一步在部署脚本里做,不在 compose 内。
# =============================================================================
services:
namesrv:
image: apache/rocketmq:5.3.1
container_name: infra-rmq-namesrv
restart: unless-stopped
network_mode: host
environment:
JAVA_OPT_EXT: "-Xms512m -Xmx512m -Xmn256m" # 压死默认 1g
command: sh mqnamesrv
broker:
image: apache/rocketmq:5.3.1
container_name: infra-rmq-broker
restart: unless-stopped
network_mode: host
depends_on: [namesrv]
environment:
JAVA_OPT_EXT: "-Xms1g -Xmx1g -Xmn512m" # 压死默认 2g
NAMESRV_ADDR: "127.0.0.1:9876" # broker 向本机 NameServer 注册
volumes:
- ./broker.conf:/home/rocketmq/rocketmq-5.3.1/conf/broker.conf
- ./data/store:/home/rocketmq/store
- ./data/logs:/home/rocketmq/logs
command: sh mqbroker -c /home/rocketmq/rocketmq-5.3.1/conf/broker.conf

View File

@ -0,0 +1,40 @@
#!/usr/bin/env bash
# =============================================================================
# RocketMQ 健康探针 —— 部署后就绪判定(切片一 阶段〇 B2)
# -----------------------------------------------------------------------------
# 两步都绿才算就绪:① NameServer 端口连通;② Broker 已在 NameServer 注册。
# 任一不满足即红,退出码 1。
#
# 两处内网纪律:
# - NameServer 端口探活走 nc 原始 TCP,不经本机 HTTP 系统代理(fake-ip 198.18.x),
# 直连 Tailscale 100.64.x。原始 TCP 本就不理会 HTTP 代理,连接直达。
# - Broker 是否注册要用 mqadmin clusterList 查,而 mqadmin 只在镜像里;故经 ssh
# 进 mini-infra、用 docker exec 在 broker 容器内跑。broker 是 host 网络,容器内
# 的 127.0.0.1:9876 即本机 NameServer。
#
# 用法:NS=100.64.0.8:9876 bash deploy/infra/rocketmq/health-check.sh
# =============================================================================
set -uo pipefail
NS="${NS:-100.64.0.8:9876}"
HOST="${NS%:*}"
PORT="${NS##*:}"
# ── ① NameServer 端口连通 ──
if ! nc -z -w5 "$HOST" "$PORT" 2>/dev/null; then
echo "FAIL NameServer ${NS} 端口不通"
exit 1
fi
# ── ② Broker 是否已在 NameServer 注册(clusterList 在 broker 容器内跑)──
# grep 精确匹配 broker 名 broker-a(与 broker.conf 的 brokerName 一致),避开表头行。
count="$(ssh -o ConnectTimeout=8 root@100.64.0.8 \
'docker exec infra-rmq-broker sh mqadmin clusterList -n 127.0.0.1:9876 2>/dev/null | grep -c broker-a' 2>/dev/null)"
count="${count//[^0-9]/}" # 只留数字,兜空值 / 多行输出
if [[ "${count:-0}" -ge 1 ]]; then
echo "PASS RocketMQ NameServer 通 + Broker 已注册(broker-a)"
exit 0
fi
echo "FAIL Broker 未在 NameServer 注册"
exit 1

View File

@ -71,6 +71,23 @@
--- ---
## RocketMQ 异步消息队列(mini-infra `100.64.0.8` · 2026-07-01 自托管落档 · 切片一 阶段〇 B2)
> game-cloud 是 Spring Cloud Alibaba,RocketMQ 是其原生异步消息基建,承载异步生成队列。自托管在 mini-infra,单机 NameServer + 单 Broker + lean JVM(broker 1g / namesrv 512m),纯增量部署(不动既有容器)。配置控制面设计 §3.7 采纳。**C3(game-cloud)`rocketmq.name-server: 100.64.0.8:9876`,gen 队列在 `AIGC_GEN_TOPIC` 上生产 / 消费。**
| 项 | 值 |
|---|---|
| **NameServer** | `100.64.0.8:9876`(客户端 `rocketmq.name-server` / `NAMESRV_ADDR` 指这里) |
| **Broker** | `100.64.0.8:10911`(brokerName `broker-a`、DefaultCluster、ASYNC_MASTER;brokerIP1 钉死 Tailscale 地址,故 NameServer 返回的 broker 地址跨机可达) |
| **gen 队列 topic** | `AIGC_GEN_TOPIC`(autoCreateTopicEnable=true,生产端首发消息时自动建;C3 生产 / 消费) |
| **鉴权** | 无(MVP 单机内网,未开 ACL、无密钥) |
| **部署位置** | mini-infra `/opt/infra-rocketmq`(compose 源在仓 `deploy/infra/rocketmq/`);镜像 `apache/rocketmq:5.3.1` |
- **存储**:store / logs 落宿主 `/opt/infra-rocketmq/data`(不入仓)。⚠️ 容器以 uid=3000 运行,该 data 目录部署时已 `chown 3000:3000`,否则 broker 无权写 CommitLog、起不来。
- **运维**:起/停 `cd /opt/infra-rocketmq && docker compose up -d / down`;探活 `NS=100.64.0.8:9876 bash deploy/infra/rocketmq/health-check.sh`(绿=NameServer 端口通 + Broker 在 NameServer 注册)。broker 1g / namesrv 512m,实测常驻内存 broker ~1.24G、namesrv ~186M。
---
## tier2 P4 服务化部署拓扑(2026-06-24 首次部署成功落档 · 团队共享) ## tier2 P4 服务化部署拓扑(2026-06-24 首次部署成功落档 · 团队共享)
> 内部开发阶段 · 内网环境;为开发方便,端点 + 凭据明文记录(铁律授权)。下面是「服务跑在哪、怎么起、连什么」。 > 内部开发阶段 · 内网环境;为开发方便,端点 + 凭据明文记录(铁律授权)。下面是「服务跑在哪、怎么起、连什么」。