# 第零步：基础设施加固 — 工程部工作报告

> 日期: 2026-05-21
> 部门: 工程部
> 负责人: CTO
> 任务编号: R1-R5

---

## 工作人员

| 姓名 | 角色 | 任务编号 | 签名 |
|------|------|---------|------|
| — | FastAPI开发 | R1, R4, R5 | — |
| — | 后端架构师 | R2 | — |
| — | 软件架构师 | R3 | — |

> 仅实际参与工作人员签名，未参与者不列入。

## 工作内容

### R1: Redis BlockingConnectionPool 替换
- 重写 `server/infrastructure/redis/client.py`
- 使用 `BlockingConnectionPool(max_connections=50, timeout=5, health_check_interval=30)`
- 新增 `init_redis(app)` 在 lifespan 启动时调用
- 新增 `close_redis()` 在 shutdown 时调用

### R2: get_redis() 启动强校验
- 去掉 `Redis | None` 返回类型 → 直接返回 `Redis`
- 启动时 ping 验证，失败直接 `SystemExit`
- 新增 `get_redis_sync()` 安全变体（graceful shutdown 用）

### R3: WebSocket 两层架构
- Layer 1: `ConnectionManager` 内存管理器（per-worker）
- Layer 2: Redis Pub/Sub `nexus:alerts` 频道中继
- `start_redis_subscriber()` / `stop_redis_subscriber()` 在 lifespan 管理

### R4: WebSocket ping/pong 心跳
- 每 30s 发送 ping
- 60s 无 pong → 僵尸连接清理
- `_heartbeat_loop()` 自动管理

### R5: WebSocket JWT 认证
- `/ws/alerts?token=xxx` 查询参数传递 JWT
- `_verify_ws_token()` 复用 JWT 验证逻辑

### D7: DB Session 泄漏修复（合并到本步骤）
- `DbSessionMiddleware` 在 main.py 中间件
- `request.state.db` 注入 session
- `dependencies.py` 4 个 service 工厂改用 `_get_request_session(request)`

## 交付物

- `server/infrastructure/redis/client.py` — Redis客户端重写
- `server/api/websocket.py` — WebSocket两层架构
- `server/main.py` — lifespan + 中间件
- `server/api/dependencies.py` — Session泄漏修复
- `server/api/servers.py` — 使用新get_redis()
- `server/api/agent.py` — 使用新get_redis()
- `server/api/health.py` — 统一检查
- `server/background/heartbeat_flush.py` — 使用新get_redis()
- `server/background/self_monitor.py` — 使用新get_redis()
- `server/application/services/sync_service.py` — 使用新get_redis()

## 验收意见

⏳ 待测试部验证