Files
VLoop/docs/plans/2025-04-25-optimization-design.md

150 lines
4.8 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.
# feedsystem_video_go 全项目优化设计文档
> **日期**: 2025-04-25
> **状态**: 待实施
> **方案**: 风险驱动分批(方案 A
## 概述
基于全项目代码审查,识别出 17 项优化点覆盖安全、数据库、MQ 可靠性、代码质量、架构、前端六大维度。按风险优先级分为三批实施。
---
## P1 止血4项— 消除生产风险
### 1. Router 变量赋值 Bug
- **文件**: `backend/internal/http/router.go:147`
- **问题**: `timelineMQ` 初始化失败时错误地将 `socialMQ` 设为 nil
- **修复**: `socialMQ = nil``timelineMQ = nil`
- **影响**: 1 行
### 2. 数据库复合索引
- **文件**: `backend/internal/video/video_entity.go`
- **问题**: Feed 流排序查询缺少索引,可能全表扫描
- **修复**: 在 Video 模型 GORM tag 中添加 3 个复合索引
- `idx_videos_create_time``ListLatest`
- `idx_videos_likes_count_id``ListLikesCountWithCursor`
- `idx_videos_popularity_time_id``ListByPopularity`
- **实施**: 修改 model tag + AutoMigrate 自动创建
### 3. ListByAuthorID 加 LIMIT
- **文件**: `backend/internal/video/video_repo.go:39-48`
- **问题**: 查询无上限,单作者海量视频可导致内存溢出
- **修复**: 加 `Limit(200)` 硬上限
### 4. MQ Worker 死信队列 + 退避重试
- **文件**: `middleware/rabbitmq/` + 4 个 Worker 文件
- **问题**: 所有 Worker 使用 `Nack(false, true)` 无限重试
- **修复**:
- 声明死信交换 + 死信队列
- 利用 `x-death` header 判断重试次数≥3 次 Ack 并告警
---
## P2 加固6项— 安全隐患 + 规范化
### 5. rand.Read 错误处理
- **文件**: `backend/internal/video/video_handler.go:164-168`
- **问题**: 忽略 `rand.Read` 错误,失败时文件名全零可能覆盖
- **修复**: `randHex()` 返回 error调用方处理
### 6. Handler 错误码精确化
- **文件**: 所有 handler 文件
- **问题**: DB/内部错误统一返回 400
- **修复**: 新增 `classifyHTTPStatus()` 辅助函数Service 层返回哨兵错误区分 400/401/404/500
### 7. JWT Secret 弱默认值
- **文件**: `backend/internal/auth/jwt.go`
- **问题**: 默认值 `"change-me-in-env"` 过于明显
- **修复**: 未设环境变量时生成随机密钥并警告
### 8. 配置密码集中管理
- **文件**: `docker-compose.yml` + 3 个 config YAML
- **问题**: 多处重复硬编码密码
- **修复**: docker-compose 引用 `.env`,创建 `.env.example`config YAML 保持现状
### 9. 前端路由鉴权守卫
- **文件**: `frontend/src/router/index.ts`
- **问题**: Settings/Video 页面无登录拦截
- **修复**: 添加 `router.beforeEach` 守卫
### 10. pprof 生产保护
- **现状**: 已监听 `127.0.0.1``config.docker.yaml` 已禁用
- **动作**: 确认安全,仅需注释说明
---
## P3 优化7项— 架构 + 可维护性
### 11. HomeView.vue 拆分
- **文件**: `frontend/src/views/HomeView.vue` (918 行)
- **拆分目标**:
- `composables/useVideoFeed.ts`
- `composables/useVideoPlayer.ts`
- `composables/useLikeFollow.ts`
- `components/CommentDrawer.vue`
- `views/HomeView.vue`(精简至 ~350 行)
### 12. Feed Service 策略拆分
- **文件**: `backend/internal/feed/service.go` (547 行)
- **拆分目标**: 按查询策略拆为 4 个文件
- `strategy_latest.go` — 热冷分离 + ZSET
- `strategy_follow.go` — 缓存穿透防护
- `strategy_hot.go` — 快照合并 + 降级
- `build_feed.go` — 公共方法
### 13. 视频列表虚拟滚动
- **问题**: 所有视频渲染 DOM内存压力大
- **修复**: 仅保留当前 ±1 条 DOM离屏 `display:none` + `pause()`
### 14. 缓存键版本化
- **文件**: `middleware/redis/redis.go` + 所有 service
- **修复**: `Client` 增加 `keyPrefix`,所有键通过 `c.Key()` 生成
### 15. Docker 健康检查
- **文件**: `docker-compose.yml`
- **修复**: 为 backend/worker/frontend 增加 healthcheck
### 16. 前端错误监控
- **文件**: `frontend/src/api/client.ts` + 新增 `utils/error-reporter.ts`
- **修复**: 增加全局错误上报钩子
### 17. Worker 优雅重启
- **文件**: `backend/cmd/worker/main.go`
- **修复**: 替换 `log.Fatal` 为指数退避重试
---
## 实施顺序
```
P1 (第1周) P2 (第2周) P3 (第3-4周)
────────────────────────────────────────────
#1 Router Bug #5 rand.Read #11 HomeView 拆分
#2 DB 索引 #6 错误码 #12 Feed 拆分
#3 LIMIT #7 JWT #13 虚拟滚动
#4 MQ 死信 #8 密码管理 #14 缓存版本化
#9 路由守卫 #15 健康检查
#10 pprof #16 错误监控
#17 Worker 重启
```
每批独立验证:`go test ./...` + `npm run build` + 冒烟测试。