From 22b3016048fed759b5bb91c85a76a0a5e9d15290 Mon Sep 17 00:00:00 2001 From: lili Date: Wed, 1 Jul 2026 08:55:59 -0700 Subject: [PATCH] =?UTF-8?q?feat(infra):=20RocketMQ=205.3.1=20=E8=87=AA?= =?UTF-8?q?=E6=89=98=E7=AE=A1=20mini-infra(NameServer+=E5=8D=95=20Broker+l?= =?UTF-8?q?ean=201g=20JVM)(=E5=88=87=E7=89=87=E4=B8=80=20=E9=98=B6?= =?UTF-8?q?=E6=AE=B5=E3=80=87=20B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 纯增量、host 网络、brokerIP1 指 Tailscale 地址;探针绿、Broker 注册成功、内存在 lean 预算内。 端点写回 docs/内网凭据与端点.md。 Co-Authored-By: Claude Opus 4.8 (1M context) --- deploy/infra/rocketmq/.gitignore | 2 ++ deploy/infra/rocketmq/broker.conf | 32 +++++++++++++++++ deploy/infra/rocketmq/docker-compose.yml | 44 ++++++++++++++++++++++++ deploy/infra/rocketmq/health-check.sh | 40 +++++++++++++++++++++ docs/内网凭据与端点.md | 17 +++++++++ 5 files changed, 135 insertions(+) create mode 100644 deploy/infra/rocketmq/.gitignore create mode 100644 deploy/infra/rocketmq/broker.conf create mode 100644 deploy/infra/rocketmq/docker-compose.yml create mode 100755 deploy/infra/rocketmq/health-check.sh diff --git a/deploy/infra/rocketmq/.gitignore b/deploy/infra/rocketmq/.gitignore new file mode 100644 index 00000000..8290b623 --- /dev/null +++ b/deploy/infra/rocketmq/.gitignore @@ -0,0 +1,2 @@ +# 容器运行时产物(Broker CommitLog / ConsumeQueue / 日志),不入仓。 +data/ diff --git a/deploy/infra/rocketmq/broker.conf b/deploy/infra/rocketmq/broker.conf new file mode 100644 index 00000000..da33bb95 --- /dev/null +++ b/deploy/infra/rocketmq/broker.conf @@ -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 diff --git a/deploy/infra/rocketmq/docker-compose.yml b/deploy/infra/rocketmq/docker-compose.yml new file mode 100644 index 00000000..6571819c --- /dev/null +++ b/deploy/infra/rocketmq/docker-compose.yml @@ -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 diff --git a/deploy/infra/rocketmq/health-check.sh b/deploy/infra/rocketmq/health-check.sh new file mode 100755 index 00000000..51f30af6 --- /dev/null +++ b/deploy/infra/rocketmq/health-check.sh @@ -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 diff --git a/docs/内网凭据与端点.md b/docs/内网凭据与端点.md index 91fe5662..baf9ca60 100644 --- a/docs/内网凭据与端点.md +++ b/docs/内网凭据与端点.md @@ -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 首次部署成功落档 · 团队共享) > 内部开发阶段 · 内网环境;为开发方便,端点 + 凭据明文记录(铁律授权)。下面是「服务跑在哪、怎么起、连什么」。