mirror of
https://github.com/zhouxiaoka/autoclip.git
synced 2026-09-03 06:24:14 +08:00
256 lines
6.4 KiB
Markdown
256 lines
6.4 KiB
Markdown
# 简化进度系统实现指南
|
||
|
||
## 概述
|
||
|
||
这是一个基于"做笨做稳"理念的简化进度同步系统,使用固定阶段 + 固定权重来驱动进度,不再依赖复杂的订阅机制。
|
||
|
||
## 核心特性
|
||
|
||
- **固定阶段**: 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
|
||
- ✅ **简单性**: 固定阶段,易于理解和维护
|
||
- ✅ **性能**: 最小化网络请求,智能缓存
|
||
- ✅ **扩展性**: 易于添加新阶段和功能
|
||
- ✅ **调试性**: 完整的日志和状态追踪
|
||
|
||
相比之前的复杂系统,这个方案更加稳定可靠,易于维护和扩展。
|