- 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.
10 KiB
GEO 平台技术架构 V1 综合审查报告(第四轮)
以大厂技术架构师视角,综合前三轮 Claude 审查结论,对 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 个功能页全部具备"可开发"条件。
但有以下前提条件:
- 团队至少需要 2 名 Go 后端 + 1 名前端 + 1 名 DevOps
- LLM/Embedding 供应商的限频和成本需提前确认
- 首版上线建议先控制在 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 个进程 以内。
如果只改三件事:
- 合并 Worker:4 个 Worker 二进制合并为 2 个(-2 部署单元)
- 统一日志与 trace:所有进程使用
zap+request_id贯穿全链路 - 恢复
viewer角色:PRD 强制要求,不能漏
其余问题(错误码、旧图清理、media-binding 同步等)可在开发过程中逐步完善。