# rocketmq（字段 `mq`，数组）

## 用户提供
- 每个 **topic** 及其 **写队列数 `writeQueue`** / **读队列数 `readQueue`**；
- 集群可以不给——按下面「集群怎么选」自己定。

---

# 集群 `mqType` 怎么选

## 〇、门禁：先确认项目引入了 MQ

满足任一即视为引入，否则**跳过本页签**并说明「未使用 RocketMQ，已跳过」：

- 依赖含 `rocketmq` / `rocketmq-spring-boot`
- 配置出现 `*namesrvAddr*` / `rocket.mq` / `rocketmq` / `*.mq.namesrv*`
- 代码有 `@RocketMQMessageListener` / `RocketMQTemplate` 等

## 一、集群 id 来源

```
GET /zqyl-devops-deliver-api/deliver/MQInfo
```
返回项的 **`id`** 即报文里的 `mqType`。
⚠️ 返回项里那个叫 `mqType` 的字段是 `null`，**不要拿它填**，要拿 `id`。

已查得的集群（2026-08，以接口实时返回为准）：

| 集群名 | id |
|---|---|
| `fc-rocketmq` | `3821287056710042640` |
| `rocketmq-public` | `3716548627020121328` |
| `rocketmq-core` | `3716548565816837360` |
| `rocketmq-finance` | `3743732357652284432` |
| `rocketmq-aiops` | `3716548506761037040` |
| `rocketmq-openPlatform` | `3829721281557693456` |
| `rocketmq-public-console` | `3789997291172004880` |
| `rocketmq-core-console` | `3789997340564128784` |
| `rocketmq-finance-console` | `3789997400693670928` |
| `rocketmq-openPlatform-console` | `3829721596164047888` |

## 二、⭐ 规则 0：`fc-` 开头的服务 → `fc-rocketmq`

**服务名以 `fc-` 开头 = 中建二局的项目，一律用 `fc-` 开头的那套配置，MQ 集群固定 `fc-rocketmq`。**

```
serverName 以 fc- 开头  →  mqType = "3821287056710042640"   (fc-rocketmq)
```

命中这条就定了，不用再往下走（下面几条仍可用来复核）。

> `fc-` 系列的 nacos 配置同理也都是 `fc-` 开头（`fc-common-rocketmq.properties` / `fc-payment-mq.properties` / `fc-payment-mysql.properties` …）。

## 三、规则 1：非 `fc-` 服务 → 查该服务历史交付单

同 [sql.md](sql.md) 那套查法，抄历史值：

```bash
GET /zqyl-devops-deliver-api/deliver/queryDeliverList
    ?page=1&pageRow=20&onlineTime=&serverName={SERVER_NAME}&configtypes=&deliverStatus=
GET /zqyl-devops-deliver-api/deliver/getDeliverDetail?deliverId={id}   → 读 mq[*].mqType
```

历史一致 → 沿用；不一致 → 问用户。

## 四、规则 2：读 namesrv 做交叉验证 / 缩小范围

定位 namesrv 的顺序：**本地 yml / properties / 常量 → Nacos**。
仓库里通常 grep 不到 namesrv（`namesrv` / `nameserver` / `rocket.mq` 都搜一遍），值在 Nacos 里，例如：

```bash
curl -s "http://{nacos}/nacos/v1/cs/configs?show=all&dataId=fc-common-rocketmq.properties&group=PUBLIC_GLOBAL_GROUP&tenant={ns}&namespaceId={ns}"
# → rocket.mq.namesrvAddr=10.111.127.15:9876;10.111.127.16:9876
```

拿到 namesrv 后按关键字/网段对照（大小写不敏感；IP 用子串匹配）：

| namesrv 特征 | 集群 |
|---|---|
| `10.111.127.15` / `10.111.127.16`（fc 系列同址） | `fc-rocketmq` |
| 含 `finance-mq` / `finance.mq`，或 IP 尾号 `.222` / `.223` | `rocketmq-finance` |
| 含 `crcl`，或 IP 尾号 `.186` / `.187` | `rocketmq-core` |
| 含 `public-mq`，或 `10.111.140.229` / `10.111.140.230` | `rocketmq-public` |

## 五、⛔ 规则 3：不设兜底，判不出来就停下来问

**严禁「未命中任何条件就归公共」这类兜底。** 上表没命中，或历史值与 namesrv 判定**冲突**时：
列出 namesrv 原值和候选集群，**问用户**，不要自己从 MQInfo 的十来个里挑。

> 反例（真实踩过）：某套判定规则带「其它未命中的一律归公共」兜底，
> 把 fc-payment（namesrv `10.111.127.15/.16`）判成了「公共」，而实际是 `fc-rocketmq`——
> 因为那类 IP 尾号约定通常是照 `test1~test5` 环境总结的，fc 系列跑在 `cscec2b`，不在那套编址里。
> 网段约定跨环境不通用，所以宁可停下来问，也不要兜底。

---

## topic 与队列数

- **topic**：从代码抽新增的 `@RocketMQMessageListener(topic=...)` / producer topic；也可能定义在 Nacos 的 `*-mq.properties` 里（如 `mq.integrationQueryTopic=fc-payment-result`），一并核对。
- **`writeQueue` / `readQueue`**：运维决策，代码里没有。沿用该服务历史单的取值，没有历史就问用户（fc-payment 历史为 **4 / 4**）。
- **`pem`**：topic 权限位，历史取值 **6**。按 RocketMQ `PermName` 常量 `PERM_WRITE=2 | PERM_READ=4 = 6`（读写），这是默认值。**不要漏填**，漏了可能存成权限 0。

## JSON

```json
"mq": [
  { "mqType": "<集群id>",
    "mqName": "",
    "mqsubInfo": [
      { "topic": "your_topic", "writeQueue": 4, "readQueue": 4, "pem": 6 }
    ] }
]
```

- 一个集群一个数组元素，该集群下的多个 topic 都放进它的 `mqsubInfo`。
- `mqName` 历史值为空串 `""`，照填即可。

## 实例（fc-payment，已查证）

历史单 `3820987202494531088`（张三，2025-09-25）：

```json
{ "mqType": "3821287056710042640", "mqName": "",
  "mqsubInfo": [
    { "topic": "payment-apply-response", "writeQueue": 4, "readQueue": 4, "pem": 6 },
    { "topic": "payment-result-notice",  "writeQueue": 4, "readQueue": 4, "pem": 6 },
    { "topic": "fc-payment-result",      "writeQueue": 4, "readQueue": 4, "pem": 6 }
  ] }
```
与规则 0 一致：`fc-payment` → `fc-rocketmq`。
