hs-video-api/CACHE_PERSISTENCE_README.md
2025-06-07 00:28:35 +08:00

245 lines
5.9 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.

# 缓存和持久化机制说明
## 概述
本项目实现了完善的任务缓存和持久化机制,确保服务重启后能够恢复任务状态,并提供高效的任务管理功能。
## 主要特性
### 1. 分层缓存设计
- **运行中任务缓存** (`running_tasks_cache`): 存储正在执行的任务(状态为 `running``queued`
- **已完成任务缓存** (`completed_tasks_cache`): 存储已完成的任务(状态为 `succeeded``failed``cancelled`
- **等待队列** (`waiting_queue`): 存储等待执行的任务请求
### 2. 持久化机制
- **文件持久化**: 等待队列数据保存到本地JSON文件
- **自动保存**: 等待队列变化时自动保存
- **启动恢复**: 服务启动时自动从持久化文件恢复等待队列
### 3. 智能清理策略
- **按时间清理**: 自动清理超过TTL的已完成任务
- **按数量限制**: 保留最新的N个已完成任务
- **定期执行**: 每10次状态更新执行一次清理
### 4. SDK数据恢复
- **启动时恢复**: 从SDK重新加载运行中和已完成的任务
- **状态同步**: 定时从SDK更新任务状态
- **缓存更新**: SDK数据变化时自动更新本地缓存
## 配置参数
### TaskQueueManager 初始化参数
```python
queue_manager = TaskQueueManager(
max_running_tasks=5, # 最大运行任务数
update_interval=5, # 状态更新间隔(秒)
persistence_file="task_queue_persistence.json" # 持久化文件路径
)
```
### 缓存配置
```python
# 在 __init__ 方法中设置
self.max_completed_cache_size = 100 # 最多保留100个已完成任务
self.completed_cache_ttl_hours = 24 # 已完成任务缓存保留24小时
```
## 工作流程
### 1. 服务启动流程
```
1. 创建TaskQueueManager实例
2. 调用start()方法
3. 从持久化文件恢复等待队列 (_load_persistence_data)
4. 从SDK恢复任务缓存 (_load_initial_tasks)
5. 启动状态更新线程 (_start_update_thread)
```
### 2. 任务创建流程
```
1. 检查是否可以创建新任务 (can_create_task)
2. 调用SDK创建任务
3. 根据队列状态决定:
- 直接加入运行中缓存
- 或加入等待队列并持久化
4. 返回任务信息和队列状态
```
### 3. 状态更新流程
```
1. 定时查询运行中任务状态
2. 更新任务缓存时间戳
3. 将完成的任务从运行中缓存移到已完成缓存
4. 处理等待队列,将等待任务移到运行中
5. 定期清理过期的已完成任务
6. 定期保存持久化数据
```
### 4. 服务停止流程
```
1. 调用stop()方法
2. 保存等待队列到持久化文件
3. 停止更新线程
4. 清理资源
```
## API接口
### 获取队列状态
```http
GET /api/video/queue/status
```
返回详细的队列状态信息:
```json
{
"success": true,
"data": {
"running_tasks_count": 3,
"completed_tasks_count": 25,
"waiting_queue_count": 2,
"total_cache_count": 30,
"status_counts": {
"running": 2,
"queued": 1,
"succeeded": 20,
"failed": 3,
"cancelled": 2,
"waiting": 2
},
"max_running_tasks": 5,
"max_completed_cache_size": 100,
"completed_cache_ttl_hours": 24,
"running_task_ids": ["task1", "task2", "task3"],
"completed_task_ids": ["task4", "task5", ...],
"waiting_task_ids": ["task6", "task7"],
"persistence_file": "task_queue_persistence.json"
}
}
```
### 查询任务结果
```http
GET /api/video/result/<task_id>
```
优先从缓存查询缓存未命中时调用SDK
1. 检查运行中任务缓存
2. 检查已完成任务缓存
3. 检查等待队列
4. 调用SDK查询如果缓存都未命中
## 持久化文件格式
```json
{
"waiting_queue": [
{
"task_id": "task_123",
"status": "waiting",
"content": {
"image_url": "...",
"prompt": "..."
},
"cache_time": "2024-01-01T12:00:00",
"created_at": "2024-01-01T12:00:00"
}
],
"timestamp": "2024-01-01T12:00:00"
}
```
## 监控和调试
### 日志级别
- `INFO`: 重要操作(启动、停止、任务状态变化)
- `DEBUG`: 详细操作(任务恢复、缓存更新)
- `WARNING`: 异常情况(任务不存在、清理失败)
- `ERROR`: 错误情况API调用失败、持久化失败
### 关键日志示例
```
启动任务队列管理器
从持久化文件恢复了 3 个等待任务
缓存恢复完成: 2 个运行中任务, 15 个已完成任务
任务状态更新: 1 个任务完成
清理了 5 个已完成任务的缓存
保存了 2 个等待任务到持久化文件
```
## 测试
运行测试脚本验证缓存和持久化机制:
```bash
python test_cache_persistence.py
```
测试内容包括:
- 持久化机制测试
- 缓存机制测试
- 清理机制测试
## 性能优化
### 1. 缓存策略
- 运行中任务优先级最高,实时更新
- 已完成任务按时间和数量双重限制
- 等待队列持久化保证数据安全
### 2. 更新频率
- 状态更新每5秒一次
- 缓存清理每10次更新一次
- 持久化保存每20次更新一次或队列变化时
### 3. 内存管理
- 自动清理过期任务
- 限制缓存大小
- 避免内存泄漏
## 故障恢复
### 服务意外重启
1. **等待队列恢复**: 从持久化文件完全恢复
2. **运行中任务恢复**: 从SDK重新加载状态
3. **已完成任务恢复**: 从SDK加载最近的任务
### 持久化文件损坏
1. 服务正常启动,但等待队列为空
2. 记录错误日志
3. 继续正常服务,新任务正常排队
### SDK服务异常
1. 缓存继续提供查询服务
2. 记录API调用失败日志
3. 定时重试恢复连接
## 最佳实践
1. **定期备份**: 备份持久化文件
2. **监控日志**: 关注缓存清理和恢复日志
3. **合理配置**: 根据业务量调整缓存大小和TTL
4. **性能监控**: 监控缓存命中率和队列长度
5. **故障演练**: 定期测试服务重启恢复能力