Files
supply-intelligence/tech/G4_REMOTE_GATEWAY_INTEGRATION_PRD_2026-05-10.md

263 lines
17 KiB
Markdown
Raw Permalink Normal View History

2026-05-12 18:49:52 +08:00
# G4 真实远端 Gateway 集成验证 PRD
文档版本v1.0
日期2026-05-10
作者PM生产门禁收口
状态:待 TechLead 评审
---
## 1. 概述
Supply-Intelligence 的 G1smoke 主链、G2inspect/metrics、G3rollback 演练)已在本地与 tksea 服务器完成。当前生产门禁为 `REQUEST_CHANGES`,唯一阻断项是 G4真实远端 gateway 集成验证。
G4 不是新增功能,而是对已有 gateway publish / consume / ack 链路在共享预发环境中的端到端实证要求。supply-intelligence 作为事件生产者sub2api / tokens-reef 作为下游消费者,必须在共享环境中留下可复核的双侧对账记录。
---
## 2. 目标
在共享预发环境中完成一次闭环验证,证明:
1. supply-intelligence 产生的 `package_change_event` 能被远端系统sub2api / tokens-reef真实消费。
2. 消费的 EVENT_ID 在 supply-intelligence 侧与远端侧均可被独立查询,且状态一致。
3. 远端消费失败时supply-intelligence 侧不会误标为 applied而是进入 retry 或保持 pending。
4. 验证过程可复现、可脚本化、可归档为 QA 复核证据。
---
## 3. 范围
### 3.1 In Scope
- supply-intelligence 共享预发环境(当前为 tksea 43.155.133.187:8081的事件 publish 与 consume-once API。
- sub2api / tokens-reef 作为远端 consumer 对 consume-once 的调用及后续处理。
- 双侧 EVENT_ID 对账机制的定义与验证脚本。
- 共享环境中 gateway runtime 的暂停/恢复操作(避免与远端 consumer 竞争单 ack 事件)。
- G4 验证证据包的格式、归档位置与 QA 复核流程。
### 3.2 Out of Scope
- supply-intelligence 核心 publish / consume / ack 业务逻辑的代码级改造(主链路已在 G1-G3 验证通过)。
- sub2api / tokens-reef 内部业务规则的深度改造(如 token 配额算法、模型路由策略)。
- 多 consumer 独立 ack schema 的长期重构(已知当前为单 ack 设计G4 通过操作规程规避竞争)。
- 非 gateway 链路probe、discovery、admission的额外验证。
### 3.3 假设与依赖
- 假设 sub2api / tokens-reef 在共享环境中已可运行tksea 8080 端口已确认运行)。
- 假设 sub2api 侧至少能提供一张持久化表或一个查询接口,记录从 supply-intelligence 消费的事件及其处理结果。
- 假设 supply-intelligence 与 sub2api 在共享环境中网络可达(同服务器已满足)。
- 依赖 sub2api 侧负责人提供消费端的最小实现或已有 bridge 的扩展方案。
- 依赖 TechLead 在 G4 验证前确认单 ack schema 的临时操作规程(暂停 gateway runtime
---
## 4. 用户场景
### 4.1 主流程:共享环境端到端对账
1. **前置**:执行人调用 `POST /gateway/runtime/pause` 暂停 supply-intelligence 内置 gateway runtime。
2. **Publish**:执行人调用 `POST /publish/package-event` 产生一个真实 EVENT_ID。
3. **远端消费**sub2api 以 consumer=`sub2api`(或已有 consumer 名称)调用 `POST /gateway/consume-once` 拉取事件。
4. **远端处理**sub2api 将事件应用到自身系统(更新模型列表、路由规则或至少写入持久化消费记录表),并在本地记录 processing_result。
5. **Ack**supply-intelligence 的 consume-once 内部自动将事件 ack 为 applied若 sub2api 调用成功)或 failed若处理返回失败
6. **双侧对账**:执行人运行对账脚本,输入 EVENT_ID查询 supply-intelligence 的 `package-changes` / `admission-state` 与 sub2api 侧的持久化记录,比对 event_id、package_id、status、consumer、timestamp。
7. **恢复**:执行人调用 `POST /gateway/runtime/resume` 恢复 gateway runtime。
8. **归档**执行人保存命令、stdout、关键 JSON 片段到证据包目录。
### 4.2 异常流:远端消费失败
1. sub2api 调用 consume-once 成功获取事件,但在后续处理时抛出业务错误(如模型不存在、数据库冲突)。
2. sub2api 不向 supply-intelligence 发送额外 ackconsume-once 已完成 ack
3. 如果 sub2api 需要标记失败,当前单 ack schema 下 consume-once 已返回 applied/ failed。因此 TechLead 必须选择以下策略之一:
- **策略 A**sub2api 在本地记录失败,对账时以 sub2api 本地记录为准supply-intelligence 侧状态视为传输层 ack。
- **策略 B**:改造 consume-once 调用方式,使 sub2api 先读取事件但不自动 ack处理成功后再显式调用 `POST /gateway/package-changes/{event_id}/ack`
4. 无论采用哪种策略QA 必须能在对账脚本中明确区分"supply-intelligence 侧状态"与"sub2api 侧真实处理结果"。
### 4.3 边缘流gateway runtime 未暂停导致事件被抢走
1. 若执行人未暂停 gateway runtime内置 consumer 会在 1 秒内自动消费并 ack 新 publish 的事件。
2. sub2api 再次调用 consume-once 时,该事件状态已为 applieditems 列表中不再包含此事件。
3. 对账脚本检测到 sub2api 侧无此 EVENT_ID 记录,判定为 mismatch。
4. **处置**:本场景作为 G4 验证的负向测试用例,用于证明单 ack schema 的竞争风险真实存在;正式 G4 验证必须通过 pause runtime 规避。
### 4.4 边缘流:重复 publish
1. 同一 EVENT_ID 被重复 publish 时supply-intelligence 返回 HTTP 409`duplicate_publish_request``publish_already_applied`)。
2. 远端 consumer 不应收到重复事件。对账脚本验证 sub2api 侧同一 EVENT_ID 仅出现一次。
### 4.5 边缘流unauthorized consumer
1. sub2api 使用的 consumer 名称若未关联目标事件的 account_id`isAuthorizedForEvent` 返回 false。
2. consume-once 的 items 列表中不包含该 unauthorized 事件。
3. 事件在 supply-intelligence 侧保持 pending不会被错误消费。
---
## 5. 验收标准AC
每条 AC 必须可被 QA 或自动化脚本在共享环境中执行,并给出二元判定(通过 / 不通过)。
**AC1远端 consumer 可达性**
- 判定方法:从 sub2api 所在主机执行 `curl -fsS -X POST "${SUPPLY_URL}/internal/supply-intelligence/gateway/consume-once?consumer=sub2api"`HTTP 状态码必须为 200响应 JSON 必须包含 `consumer``items` 字段。
- 通过标准HTTP 200 且 JSON schema 符合 `ConsumeOnceOutput` 定义。
**AC2真实事件被远端消费**
- 判定方法:在 supply-intelligence 侧执行 publish 产生 EVENT_ID `evt-g4-{timestamp}`;随后从 sub2api 侧调用 consume-once检查 sub2api 侧持久化存储中是否存在该 EVENT_ID 的记录。
- 通过标准sub2api 侧数据库表或审计日志中至少存在一条记录,其 `event_id` 字段等于 `evt-g4-{timestamp}`
**AC3supply-intelligence 侧事件终态正确**
- 判定方法:在 AC2 完成后,调用 `GET /internal/supply-intelligence/gateway/package-changes``GET /internal/supply-intelligence/models/{platform}/{model}/admission-state`,检查该 EVENT_ID 的 `gateway_sync_status`
- 通过标准:对于成功的远端消费,`gateway_sync_status``applied`;对于明确失败的远端消费,`gateway_sync_status``failed`。不允许为 `pending`
**AC4双侧状态可对账**
- 判定方法:执行对账脚本(待 TechLead 提供,路径建议 `scripts/g4_reconcile.sh`),输入 EVENT_ID脚本分别查询 supply-intelligence 与 sub2api 两侧。
- 通过标准:脚本输出 JSON 必须包含 `match=true`,且两侧 `event_id``package_id``status`(或 processing_result一致脚本执行时间不得超过 60 秒。
**AC5远端消费失败时的状态隔离**
- 判定方法:制造一个远端处理失败的场景(例如 sub2api 消费后记录 processing_result=failed或在 consume-once 前模拟 sub2api 内部错误);检查 supply-intelligence 侧事件状态与 sub2api 侧记录。
- 通过标准:若采用策略 A传输层 acksupply-intelligence 侧可为 applied但 sub2api 侧必须记录 processing_result=failed对账脚本输出 `match=false` 并标注原因;若采用策略 B显式 acksupply-intelligence 侧必须为 failed。不允许出现"supply-intelligence 侧 applied 且 sub2api 侧无记录"的幽灵状态。
**AC6gateway runtime 暂停不影响 API 可用性**
- 判定方法:在 gateway runtime 暂停期间(`paused=true`),重复执行 AC1 的 consume-once 调用,同时检查 `healthz``runtime-status`
- 通过标准consume-once API 返回 200`healthz` 返回 ok`runtime-status` 返回 `paused=true`gateway runtime 恢复后 `paused=false`
**AC7完整闭环证据归档**
- 判定方法:执行人在共享环境中完成 AC1-AC6 后,将产物写入 `reports/production/evidence-g4-{date}/` 目录。
- 通过标准:目录中必须包含以下文件,且时间戳在 24 小时内:
- `00_preflight.json`healthz + runtime-status 演练前)
- `01_publish.json`publish 响应)
- `02_consume_once.json`sub2api 侧调用 consume-once 的响应)
- `03_sub2api_record.sql``.json`sub2api 侧持久化记录查询结果)
- `04_reconcile.json`(对账脚本输出)
- `05_runtime_after_resume.json`(恢复后的 runtime-status
---
## 6. 边缘情况与失败路径
| 场景 | 预期行为 | 验证方式 |
|------|---------|---------|
| gateway runtime 未暂停,事件被内置 consumer 抢走 | sub2api consume-once 返回空 items对账 mismatch | AC4 负向测试 |
| sub2api 调用 consume-once 时 supply-intelligence 宕机 | sub2api 收到 HTTP 5xx 或连接超时;事件保持 pending | 检查 supply-intelligence 重启后事件状态仍为 pending |
| sub2api 消费后宕机,未写入本地记录 | 对账时 sub2api 侧 not_foundsupply-intelligence 侧可能已 applied | AC5 明确失败策略 |
| 重复调用 consume-once 同一 cursor | 返回空 items 或 next_cursor 为空;无重复 ack | AC4 验证 sub2api 侧无重复记录 |
| 使用未授权的 consumer 名称 | consume-once 不返回该账号事件;事件保持 pending | 负向测试publish 后换 consumer 名称调用,验证 items 为空 |
| 网络分区导致 consume-once 超时 | sub2api 侧重试supply-intelligence 侧事件状态不变 | 模拟超时后重试,验证事件未被错误 ack |
---
## 7. 上线与运营准备
### 7.1 共享环境配置清单
- [ ] supply-intelligence 在 tksea 的 BASE_URL 已确认(当前 43.155.133.187:8081
- [ ] sub2api / tokens-reef 在 tksea 的地址与数据库连接串已确认(当前 8080 端口PostgreSQL 本地)。
- [ ] sub2api 侧 consumer 名称已确定(建议 `sub2api` 或沿用 `sub2api-bridge`)。
- [ ] sub2api 侧持久化表已创建(至少含 event_id, package_id, status, consumed_at, processing_result 字段)。
- [ ] supply-intelligence 侧 gateway runtime 可在验证前被手动暂停。
### 7.2 对账脚本
- TechLead 需提供 `scripts/g4_reconcile.sh`,输入 EVENT_ID 与两侧 BASE_URL输出 JSON 对账结果。
- 脚本必须返回明确 exit code0match、1mismatch、2not_found / 查询失败)。
### 7.3 监控与告警
- G4 验证期间,共享环境必须保持 `/metrics` 可访问。
- 对账脚本执行后,必须记录 `supply_intelligence_gateway_events_processed_total``supply_intelligence_gateway_failed_events` 的采样值。
- 若 G4 验证重复执行超过 3 次仍 mismatch值班人员必须通知 TechLead 排查,禁止强行修改数据通过门禁。
### 7.4 回滚预案
- 若 G4 验证导致 sub2api 侧数据异常sub2api 侧负责人应使用自身系统的回滚机制恢复。
- supply-intelligence 侧可通过 `gateway/runtime/pause` 停止事件下发,已 ack 的事件不可回滚(事件日志性质)。
- 若需要撤销已 publish 的 package使用 supply-intelligence 的 publish 替换机制(发布新 package-event而非删除历史 event。
### 7.5 值班 runbook
1. 执行 G4 前,确认 `runtime-status``started=true`,然后执行 `runtime/pause`
2. 执行 publish记录返回的 EVENT_ID。
3. 等待 sub2api 侧执行 consume-once或手动触发
4. 运行 `g4_reconcile.sh`
5. 若 match=true执行 `runtime/resume`,归档证据包。
6. 若 match=false保持 paused 状态,通知 TechLead 与 sub2api 侧负责人,排查后重新执行。
---
## 8. 依赖与风险
| 依赖项 | 状态 | 风险描述 | 缓解措施 |
|--------|------|---------|---------|
| sub2api 侧 consumer 实现 | 缺失 | sub2api 当前未配置 supply-intelligence 集成,无持久化消费记录 | sub2api 侧负责人需在 G4 前完成最小消费记录表与查询接口 |
| 单 ack schema | 已知限制 | 同一时间只能有一个 consumer ack 事件gateway runtime 会与 sub2api 抢事件 | G4 验证期间通过 `runtime/pause` 规避;长期需 TechLead 评估多 consumer schema 改造 |
| 网络稳定性 | 中风险 | tksea 同服务器网络应稳定,但跨容器/进程调用仍可能失败 | 对账脚本增加重试与超时;失败时标记为 not_found 而非误报 match |
| 证据包人工操作 | 中风险 | 执行人可能遗漏归档步骤或时间戳不一致 | 对账脚本自动将结果写入文件QA 复核时检查文件存在性与时间戳 |
| sub2api 业务逻辑不可用 | 低风险 | 若 sub2api 内部业务系统暂无法处理 package changebridge 只能写日志 | PRD 接受"持久化消费记录表"作为最低证据,不要求立即触发完整业务闭环 |
---
## 9. 阶段门控结论
### 9.1 当前信息是否足够进入 TechLead 设计阶段?
**结论:足够。**
依据:
1. G4 缺口已被精确识别,不是模糊的"缺集成",而是"缺远端 consumer 消费 + 双侧对账证据"。
2. supply-intelligence 侧的 APIpublish、consume-once、package-changes、admission-state、runtime pause/resume已经存在且经 G1-G3 验证稳定。
3. sub2api-bridge 已提供技术方向参考pull 模式、写日志表TechLead 只需在此基础上扩展为持久化记录 + 查询接口。
4. 单 ack schema 的限制已被识别并有明确的临时操作规程pause runtime
5. 所有验收标准均已量化HTTP 200、60 秒、match=true/false、特定 JSON 字段)。
### 9.2 TechLead 必须产出的设计决策
1. **策略选择**:采用策略 A传输层 ack + sub2api 本地记录 processing_result还是策略 B显式 ack 接口)?
2. **sub2api 侧最小实现**:确定 consumer 名称、持久化表 schema、查询接口路径。
3. **对账脚本**`scripts/g4_reconcile.sh` 的实现(语言、两侧查询方式、输出 schema
4. **多 consumer 长期方案**:是否在 G4 之后启动多 consumer 独立 ack schema 的改造?(当前 G4 不要求改造)。
### 9.3 QA 可提前准备的内容
1. 基于本 PRD 的 AC 编写自动化测试用例框架(即使 sub2api 侧尚未 ready也可 mock 远端查询接口)。
2. 审核证据包目录结构与命名规范。
3. 准备负向测试用例unauthorized consumer、重复 publish、runtime 未暂停)。
---
## 10. 下游关注点摘要
### 10.1 给 TechLead
- **核心决策**G4 只需要证明"远端真实消费",不需要一次性完成完美的双向 ack。请尽快确认策略 A 或 B以便 QA 编写对账脚本。
- **已知债务**`CountRetryablePendingPackageEvents``ListRetryablePendingPackageEvents` 当前忽略 consumer 参数QA 报告 4.1。G4 使用单 consumer 验证,暂不触发该债务,但请记录到后续迭代 backlog。
- **实现量评估**sub2api 侧最小改造量约为:创建一张消费记录表 + 一个查询接口 + 扩展 bridge 逻辑。若已有 sub2api-bridge改造量预计在 1-2 人日。
### 10.2 给 QA
- **测试重点**:不要只验证"consume-once 返回 200",必须验证 EVENT_ID 在 sub2api 侧有持久化记录。
- **负向用例**:务必执行"runtime 未暂停"场景,证明单 ack 竞争真实存在,且 pause 是 G4 的必要前置步骤。
- **证据完整性**:严格按照 AC7 的 6 个文件清单审核证据包,缺少任一文件即判定 G4 不通过。
### 10.3 给 XL执行/运维)
- **执行顺序**:必须先 pause → publish → 等待 sub2api 消费 → 对账 → resume。任何跳过 pause 的执行均视为无效证据。
- **环境保真**G4 验证期间tksea 上的 supply-intelligence 与 sub2api 配置不得被其他测试干扰。建议预约独占窗口。
- **产物路径**:证据包统一存放于 `reports/production/evidence-g4-YYYY-MM-DD/`,由 QA 复核后合并到 `SHARED_ENV_EVIDENCE_RUN_YYYY-MM-DD.md`
---
## 附录 A自检清单
返回本 PRD 时,以下条目已逐项确认:
- [x] 已明确真实目标,不是只复述功能
- [x] 已写清 In Scope / Out of Scope
- [x] 每个 AC 都可被 QA 或测试用例直接验证
- [x] 已覆盖异常流、边缘流与失败路径
- [x] 已补齐上线、运营、监控、回滚要求
- [x] 已明确当前是否可进入 TechLead 阶段
- [x] 已给出 TechLead / QA / XL 的下游关注点摘要
- [x] 没有使用"优化、支持、友好、尽量、快速"等模糊词替代明确要求