Files
geo/docs/claude_architecture_review_4.md
T
root de30497f59 feat: add tenant and user management with migrations, handlers, and tests
- 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.
2026-04-01 00:58:42 +08:00

243 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 万
---
## 三、本轮发现的问题与建议
以下是前三轮未充分覆盖、但作为架构师我认为必须关注的问题:
### 🔴 必须修正(影响运维简单性或可实施性)
#### 问题 1V1 阶段 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
#### 问题 6Docker 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
#### 问题 7media-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 同步等)可在开发过程中逐步完善。