de30497f59
- Implemented tenant and user management features including: - Tenant creation and management with associated migrations. - User creation and management with associated migrations. - Tenant membership management with associated migrations. - Platform user roles management with associated migrations. - Quota management with associated migrations. - Article and template management with associated migrations. - Added HTTP handlers for templates and workspaces. - Created tests for protected and public routes. - Introduced a script to check tenant scope in SQL queries. - Documented task plan for backend completion and frontend foundation.
243 lines
10 KiB
Markdown
243 lines
10 KiB
Markdown
# GEO 平台技术架构 V1 综合审查报告(第四轮)
|
||
|
||
> 以大厂技术架构师视角,综合前三轮 Claude 审查结论,对 [geo-platform-ops-admin-tech-architecture-v1.md](file:///d:/project/geo/docs/geo-platform-ops-admin-tech-architecture-v1.md) 进行终审,聚焦 **可实施性** 和 **运维简单性**。
|
||
|
||
---
|
||
|
||
## 一、前三轮审查问题收敛确认
|
||
|
||
### 第一轮 → 第二轮(功能闭环修复)
|
||
|
||
| # | 问题 | 状态 |
|
||
| --- | --- | --- |
|
||
| 1 | 定时调度器缺失 | ✅ 已补齐 `cmd/scheduler` |
|
||
| 2 | Prompt 规则管理缺失 | ✅ 已补齐模块 + 表 |
|
||
| 3 | 模板管理缺失 | ✅ 已补齐 `article_templates` |
|
||
| 4 | 数据库 Schema 缺失 | ✅ 已补齐 30+ 张表 |
|
||
| 5 | GEO 指标采集方案缺失 | ✅ 已补齐问题驱动监控 |
|
||
| 6-12 | 版本管理 / 插件协议 / SSE / 路由 | ✅ 全部修复 |
|
||
|
||
### 第二轮 → 第三轮(5 万并发 + 一致性修复)
|
||
|
||
| # | 问题 | 状态 |
|
||
| --- | --- | --- |
|
||
| 1 | Gateway 扩展方案 | ✅ §13.13.1 补充了 HPA + L7 负载均衡 |
|
||
| 2 | SSE 连接策略 | ✅ §13.10.3 改为默认轮询 + 按需 SSE |
|
||
| 3 | Scheduler 故障恢复 | ✅ §13.13.2 补充了恢复策略 |
|
||
| 4 | PostgreSQL 分区 | ✅ §13.13.3 补充了审计/监控表分区 |
|
||
| 5 | 限流 + 熔断 | ✅ §13.13.4 补充了租户级令牌桶 + Worker 并发池 |
|
||
| 6 | 配置管理方案 | ✅ §13.13.6 补充了三级配置 |
|
||
| 7 | Sponge 使用原则 | ✅ §13.13.7 明确仅作脚手架 |
|
||
| 8 | Migration 策略 | ✅ §13.13.8 补充了 golang-migrate |
|
||
| 9 | 租户隔离保障 | ✅ §13.13.9 补充了 TenantScope |
|
||
|
||
### 第三轮提出的残留问题
|
||
|
||
| # | 问题 | 当前状态 |
|
||
| --- | --- | --- |
|
||
| 1 | RAG 检索未纳入主架构图 | ✅ §13.5.1 修订图已补 `WG → QD` 箭头;§5.5.2 新增 `shared/retrieval` |
|
||
| 2 | media-binding 接口不一致 | ⚠️ **仍残留** — media-binding-v1.md 未同步更新 |
|
||
| 3 | 数据追踪 Schema 字段不一致 | ✅ §13.11.6 已与监控方案对齐 |
|
||
| 4 | `knowledge_chunks_meta` 表缺失 | ✅ §13.11.4 已补充 |
|
||
| 5 | `retrieval_logs` 落地策略 | ✅ §13.11.4 末尾明确 V1 写文件日志 |
|
||
| 6 | `kol` 角色权限不清 | ✅ §6.2.3 补充了权限矩阵 |
|
||
| 7 | `article_templates.scope` | ✅ §13.11.2 已补充 scope 字段 |
|
||
| 8 | LLM 超时 / 限流 / 并发池 | ✅ §13.13.4 明确 30s 超时 + semaphore 50 |
|
||
| 9 | 事务边界 | ✅ §13.13.9 明确了关键事务边界 |
|
||
| 10 | 额度预扣/退还策略 | ✅ §13.7.3 明确了预扣 + 失败退还 + 对账 |
|
||
|
||
> [!TIP]
|
||
> **三轮审查共计约 40 项问题,当前仅剩 1 项残留(media-binding 文档未同步)。架构整体完成度非常高。**
|
||
|
||
---
|
||
|
||
## 二、当前架构总体评价
|
||
|
||
### 2.1 架构复杂度评级
|
||
|
||
| 维度 | 现状 | 评价 |
|
||
| --- | --- | --- |
|
||
| 进程数量 | gateway + 2 API + scheduler + 4 worker = **8 个** | ⚠️ 偏多但合理 |
|
||
| 中间件 | PG + Redis + RabbitMQ + Qdrant + OSS = **5 个** | ⚠️ 每个都必要,无冗余 |
|
||
| 数据库表 | **30+ 张** | ✅ 职责单一,不算过度 |
|
||
| 前端应用 | 2 后台 + 1 插件 | ✅ 合理 |
|
||
| 部署形态 | Docker Compose(开发)+ K8s(生产) | ✅ 标准 |
|
||
|
||
### 2.2 可实施性判断
|
||
|
||
> [!IMPORTANT]
|
||
> **结论:可实施。** 文档已覆盖从页面路由 → API → 数据模型 → 异步链路 → 部署的完整闭环。8 个功能页全部具备"可开发"条件。
|
||
|
||
**但有以下前提条件:**
|
||
1. 团队至少需要 2 名 Go 后端 + 1 名前端 + 1 名 DevOps
|
||
2. LLM/Embedding 供应商的限频和成本需提前确认
|
||
3. 首版上线建议先控制在 **1000 并发** 内验证,而非直接冲 5 万
|
||
|
||
---
|
||
|
||
## 三、本轮发现的问题与建议
|
||
|
||
以下是前三轮未充分覆盖、但作为架构师我认为必须关注的问题:
|
||
|
||
### 🔴 必须修正(影响运维简单性或可实施性)
|
||
|
||
#### 问题 1:V1 阶段 Gateway 存在过度设计的嫌疑
|
||
|
||
当前方案 `cmd/gateway` 作为独立进程做路由分发。但 V1 只有 2 个下游(tenant-api、platform-api),且 gateway 只做鉴权 + 路由转发。
|
||
|
||
**运维影响**:多一个进程 = 多一套部署/监控/日志/重启策略。
|
||
|
||
**建议**:
|
||
- **V1 简化方案**:将 gateway 的鉴权中间件合并到 `tenant-api` 和 `platform-api` 中,由 Nginx/Ingress 按 `/api/tenant/*` 和 `/api/platform/*` 做 L7 路由分发
|
||
- 省掉 1 个进程,运维直接减负
|
||
- V1.5 如果需要统一限流/审计注入,再独立出 gateway
|
||
|
||
> [!WARNING]
|
||
> 如果选择保留 gateway,则必须确保它"足够薄"——只做路由 + 鉴权 + 限流,**绝不放业务逻辑**。否则它会变成系统的"上帝对象"。
|
||
|
||
我的想法是保留的,但第一版,只做路由 + 鉴权 + 限流
|
||
|
||
#### 问题 2:8 个进程的运维负担
|
||
|
||
生产环境需要管理 8 个独立二进制(gateway + tenant-api + platform-api + scheduler + 4 worker),每个都需要:
|
||
- 独立的 Dockerfile
|
||
- 独立的 K8s Deployment + Service
|
||
- 独立的日志采集
|
||
- 独立的健康检查
|
||
|
||
**建议**:
|
||
- 4 个 Worker 在 V1 阶段考虑合并为 **2 个 Worker 二进制**:
|
||
- `worker-main`:消费 generate + knowledge + analytics 队列(按 routing key 区分)
|
||
- `worker-callback`:消费 publish-callback 队列
|
||
- 代码层面保持模块隔离(`internal/jobs/` 下仍然分独立 package),只是 `cmd/` 入口合并
|
||
- 部署从 8 个进程降为 **5 个**(tenant-api + platform-api + scheduler + worker-main + worker-callback)
|
||
|
||
审核员想法: 不采纳,合并后系统用户体验会变差会更慢
|
||
|
||
#### 问题 3:`viewer` 角色仍未恢复
|
||
|
||
§6.2.2 中只有 `tenant_admin` / `editor` / `kol`。PRD 明确定义了"只读成员"。
|
||
|
||
审核员意图:viewer 角色没用,删除;kol其实也只是用户,但是这个角色比普通用户要更会写 prompt,别人可以直接使用她的分享码,使用她分享的prompt(其中主要信息,比如公司名啊,地址啊,还是得用户填)
|
||
|
||
---
|
||
|
||
### 🟡 建议优化(提升运维效率)
|
||
|
||
#### 问题 4:缺少统一的错误码规范
|
||
|
||
文档定义了 40+ 个 API 接口,但没有统一的错误码体系。前后端联调时会出现:
|
||
- 后端返回 `{"error": "xxx"}` 格式不统一
|
||
- 前端无法区分"额度不足"和"LLM 超时"和"参数错误"
|
||
|
||
**建议**:定义统一错误响应和错误码段:
|
||
|
||
```
|
||
{
|
||
"code": 40301,
|
||
"message": "quota_insufficient",
|
||
"detail": "生成额度不足,请升级套餐"
|
||
}
|
||
```
|
||
|
||
| 错误码段 | 含义 |
|
||
| --- | --- |
|
||
| 400xx | 参数校验 |
|
||
| 401xx | 认证 |
|
||
| 403xx | 权限/额度 |
|
||
| 404xx | 资源不存在 |
|
||
| 409xx | 状态冲突 |
|
||
| 500xx | 内部错误 |
|
||
| 503xx | 下游不可用(LLM/Qdrant) |
|
||
|
||
#### 问题 5:缺少日志规范与链路追踪
|
||
|
||
8 个进程的分布式架构,单个请求可能跨 gateway → API → MQ → Worker。排查问题需要:
|
||
- 统一的 `request_id` / `trace_id` 贯穿全链路
|
||
- 结构化日志(JSON 格式)
|
||
- 日志级别规范
|
||
|
||
`internal/shared/observability` 模块已定义在目录结构中,但文档中没有展开。
|
||
|
||
**建议**:
|
||
- 所有进程使用统一日志库(如 `zap`)
|
||
- gateway 生成 `request_id`,全链路透传
|
||
- MQ 消息 header 中携带 `trace_id`
|
||
- 使用 Jaeger
|
||
|
||
#### 问题 6:Docker Compose 本地开发的启动顺序和依赖
|
||
|
||
5 个中间件 + 8 个服务的本地开发环境,`docker-compose up` 时:
|
||
- PG 未就绪时 API 连接失败
|
||
- RabbitMQ 未初始化队列时 Worker 报错
|
||
- Qdrant 启动慢导致知识库功能不可用
|
||
|
||
**建议**:
|
||
- `docker-compose.yml` 中只放中间件(PG/Redis/RabbitMQ/Qdrant/MinIO)
|
||
- Go 服务本地 `go run` 开发,用 `Makefile` 或 `Task` 统一启动
|
||
- 提供一键初始化脚本:`make dev-init`(创建队列、运行 migration、创建 bucket)
|
||
|
||
#### 问题 7:media-binding-v1.md 仍与主架构不一致
|
||
|
||
第三轮审查已指出,至今未同步。
|
||
|
||
**建议**:以主架构 §13.8 的插件会话模型为准,更新 media-binding-v1.md 的接口定义。
|
||
|
||
---
|
||
|
||
### 🟢 小问题(不阻塞但建议修正)
|
||
|
||
| # | 问题 | 说明 |
|
||
| --- | --- | --- |
|
||
| 1 | §8 旧交互图与 §13.5.1 修订图并存 | 建议删除旧图或标注"以 §13 为准" |
|
||
| 2 | §9 后端结构图缺 scheduler 节点 | 与实际设计不符 |
|
||
| 3 | §5.5.9 `platform/audit` 只有标题无内容 | 已在 §13 补齐,建议填充或删除旧节 |
|
||
| 4 | Vite 8 版本号存疑 | §2.2 提到 `Vite 8`,截至 2026.3 Vite 最新稳定版需确认 |
|
||
|
||
---
|
||
|
||
## 四、运维简单性终审
|
||
|
||
### 4.1 运维维度打分
|
||
|
||
| 维度 | 评分 | 说明 |
|
||
| --- | --- | --- |
|
||
| 部署复杂度 | ⭐⭐⭐ | 8 个进程偏多,建议合并 Worker |
|
||
| 监控难度 | ⭐⭐⭐ | 有 observability 模块但未展开 |
|
||
| 故障排查 | ⭐⭐ | 缺少 trace_id + 结构化日志规范 |
|
||
| 扩容简易度 | ⭐⭐⭐⭐ | gateway/API 无状态,HPA 就绪 |
|
||
| 配置管理 | ⭐⭐⭐⭐ | 三级配置合理 |
|
||
| 数据库运维 | ⭐⭐⭐ | 分区策略已定义,缺归档自动化 |
|
||
|
||
### 4.2 V1 运维简化建议清单
|
||
|
||
| # | 简化措施 | 效果 |
|
||
| --- | --- | --- |
|
||
| 1 | 合并 4 Worker 为 2 个 | 减少 2 个部署单元 |
|
||
| 2 | 合并 Gateway 到 Ingress 路由 | 减少 1 个部署单元 |
|
||
| 3 | 统一日志 + request_id | 大幅降低排查成本 |
|
||
| 4 | 提供 `make dev-init` | 新人 10 分钟启动开发环境 |
|
||
| 5 | 自动化 migration CI | 避免手动 DDL 事故 |
|
||
| 6 | 审计/监控表自动归档脚本 | 避免磁盘满 |
|
||
|
||
---
|
||
|
||
## 五、最终结论
|
||
|
||
> [!IMPORTANT]
|
||
> ### 可实施性:✅ 通过
|
||
>
|
||
> 文档已从"宏观方案"演进为可直接进入开发的"闭环方案"。8 个功能页全部具备路由 → API → 模型 → 异步 → 存储 → 状态回传的完整链路。
|
||
>
|
||
> ### 运维简单性:⚠️ 有优化空间
|
||
>
|
||
> 当前 **8 个进程 + 5 个中间件** 对小团队偏重。建议 V1 合并 Worker、考虑去掉独立 Gateway,将运维实体控制在 **5 个进程** 以内。
|
||
|
||
### 如果只改三件事:
|
||
|
||
1. **合并 Worker**:4 个 Worker 二进制合并为 2 个(-2 部署单元)
|
||
2. **统一日志与 trace**:所有进程使用 `zap` + `request_id` 贯穿全链路
|
||
3. **恢复 `viewer` 角色**:PRD 强制要求,不能漏
|
||
|
||
其余问题(错误码、旧图清理、media-binding 同步等)可在开发过程中逐步完善。
|