Files
autoclip/docs/SIMPLE_PROGRESS_SYSTEM.md

256 lines
6.4 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.
# 简化进度系统实现指南
## 概述
这是一个基于"做笨做稳"理念的简化进度同步系统,使用固定阶段 + 固定权重来驱动进度,不再依赖复杂的订阅机制。
## 核心特性
- **固定阶段**: 6个预定义阶段每个阶段有固定权重
- **简单轮询**: 前端通过HTTP API轮询获取进度无需WebSocket
- **Redis存储**: 后端使用Redis存储进度快照支持持久化
- **极简事件**: 每个阶段切换时发送一次事件最多6次
## 系统架构
### 后端组件
1. **`backend/services/simple_progress.py`** - 核心进度服务
- 阶段定义和权重计算
- Redis存储和事件发布
- 进度快照管理
2. **`backend/api/v1/simple_progress.py`** - API接口
- `/api/v1/simple-progress/snapshot` - 批量获取进度快照
- `/api/v1/simple-progress/snapshot/{project_id}` - 单个项目进度
- `/api/v1/simple-progress/stages` - 获取阶段配置
3. **`backend/services/simple_pipeline_adapter.py`** - 流水线适配器
- 集成进度上报到现有流水线
- 自动发送阶段切换事件
### 前端组件
1. **`frontend/src/stores/useSimpleProgressStore.ts`** - 状态管理
- Zustand状态管理
- 轮询控制
- 进度数据缓存
2. **`frontend/src/components/SimpleProgressBar.tsx`** - 进度条组件
- 单个项目进度显示
- 批量项目进度显示
- 自动轮询集成
3. **`frontend/src/components/SimpleProjectCard.tsx`** - 项目卡片
- 集成进度显示
- 状态管理
- 操作按钮
## 阶段定义
```python
STAGES = [
("INGEST", 10), # 下载/就绪
("SUBTITLE", 15), # 字幕/对齐
("ANALYZE", 20), # 语义分析/大纲
("HIGHLIGHT", 25), # 片段定位/打分
("EXPORT", 20), # 导出/封装
("DONE", 10), # 校验/归档
]
```
## 进度计算
```python
def compute_percent(stage: str, subpercent: Optional[float] = None) -> int:
# 累加之前阶段权重
done = 0
for s in ORDER:
if s == stage:
break
done += WEIGHTS[s]
# 当前阶段
cur = WEIGHTS.get(stage, 0)
if subpercent is None:
return min(100, done + cur) if stage == "DONE" else min(99, done)
else:
return min(99, done + int(cur * subpercent / 100))
```
## 事件格式
```json
{
"project_id": "46ab50a6-....",
"stage": "HIGHLIGHT",
"percent": 70,
"message": "已完成片段定位,共 12 段候选",
"ts": 1640995200
}
```
## 使用方法
### 后端集成
1. **在流水线中发送进度事件**:
```python
from backend.services.simple_progress import emit_progress
# 阶段切换
emit_progress(project_id, "ANALYZE", "开始内容分析")
# 带子进度
emit_progress(project_id, "ANALYZE", "分析中(50%)", subpercent=50)
```
2. **使用简化的流水线适配器**:
```python
from backend.services.simple_pipeline_adapter import create_simple_pipeline_adapter
adapter = create_simple_pipeline_adapter(project_id, task_id)
result = adapter.process_project_sync(video_path, srt_path)
```
### 前端集成
1. **使用进度状态管理**:
```typescript
import { useSimpleProgressStore } from '../stores/useSimpleProgressStore'
const { startPolling, stopPolling, getProgress } = useSimpleProgressStore()
// 开始轮询
startPolling(['project-1', 'project-2'], 2000)
// 获取进度
const progress = getProgress('project-1')
```
2. **使用进度条组件**:
```tsx
import { SimpleProgressBar } from '../components/SimpleProgressBar'
<SimpleProgressBar
projectId="project-1"
autoStart={true}
pollingInterval={2000}
showDetails={true}
onProgressUpdate={(progress) => console.log(progress)}
/>
```
3. **使用项目卡片组件**:
```tsx
import { SimpleProjectCard } from '../components/SimpleProjectCard'
<SimpleProjectCard
project={project}
onStartProcessing={handleStart}
onViewDetails={handleView}
onDelete={handleDelete}
onRetry={handleRetry}
/>
```
## API接口
### 获取进度快照
```bash
# 批量获取
GET /api/v1/simple-progress/snapshot?project_ids=project-1&project_ids=project-2
# 单个获取
GET /api/v1/simple-progress/snapshot/project-1
```
### 获取阶段配置
```bash
GET /api/v1/simple-progress/stages
```
## 配置选项
### 轮询间隔
- 默认: 2000ms (2秒)
- 建议范围: 1000-5000ms
- 可根据网络状况调整
### 阶段权重
- 总权重: 100
- 可调整各阶段权重以适应实际处理时间
- 权重分配应考虑各阶段的实际耗时
## 故障处理
### Redis连接失败
- 系统会记录警告日志
- 进度事件发送会被跳过
- 前端轮询会返回空数据
### 网络中断
- 前端轮询会自动重试
- 进度数据会缓存在本地状态
- 网络恢复后自动同步
### 阶段异常
- 支持失败状态检测
- 自动标记为失败状态
- 提供重试机制
## 性能优化
1. **批量轮询**: 一次请求获取多个项目进度
2. **智能缓存**: 避免重复请求相同数据
3. **条件轮询**: 只在需要时启动轮询
4. **自动清理**: 定期清理过期进度数据
## 扩展性
1. **新增阶段**: 修改STAGES配置即可
2. **调整权重**: 重新分配各阶段权重
3. **自定义消息**: 支持阶段特定的消息格式
4. **多环境支持**: 通过配置支持不同环境
## 监控和调试
1. **日志记录**: 详细的进度事件日志
2. **状态检查**: 实时进度状态查询
3. **错误追踪**: 完整的错误信息记录
4. **性能指标**: 轮询频率和响应时间监控
## 迁移指南
从旧的复杂进度系统迁移到简化系统:
1. **后端迁移**:
- 替换进度回调为emit_progress调用
- 使用SimplePipelineAdapter替换旧适配器
- 移除复杂的WebSocket进度发布
2. **前端迁移**:
- 使用useSimpleProgressStore替换旧状态管理
- 使用SimpleProgressBar替换旧进度组件
- 配置轮询替代WebSocket订阅
3. **数据迁移**:
- 清理旧的进度数据
- 初始化新的Redis进度存储
- 更新项目状态映射
## 总结
这个简化进度系统通过"做笨做稳"的设计理念,提供了:
-**可靠性**: 基于HTTP轮询不依赖WebSocket
-**简单性**: 固定阶段,易于理解和维护
-**性能**: 最小化网络请求,智能缓存
-**扩展性**: 易于添加新阶段和功能
-**调试性**: 完整的日志和状态追踪
相比之前的复杂系统,这个方案更加稳定可靠,易于维护和扩展。