Ai_GirlFriend/xuniYou/唱歌视频问题完整解决方案.md

293 lines
6.6 KiB
Markdown
Raw Permalink Normal View History

2026-03-02 18:57:11 +08:00
# 唱歌视频问题完整解决方案
## 问题汇总
### 问题1: 任务失败 - "文件下载失败"
- **任务**: 382, 384
- **原因**: OSS配置错误使用了错误的bucket
- **状态**: ✅ 已修复
### 问题2: 任务卡住 - 一直running
- **任务**: 385
- **原因**: 任务处理超时,未正确标记失败
- **状态**: ⚠️ 需要手动修复
## 完整修复流程
### 第一步修复OSS配置已完成
`.env` 文件已更新为:
```env
ALIYUN_OSS_BUCKET_NAME=nvlovers
ALIYUN_OSS_ENDPOINT=https://oss-cn-qingdao.aliyuncs.com
ALIYUN_OSS_CDN_DOMAIN=https://nvlovers.oss-cn-qingdao.aliyuncs.com
```
### 第二步:清理卡住的任务
**方法A: 使用一键脚本(推荐)**
```bash
双击运行: 修复卡住的任务.bat
```
**方法B: 手动执行SQL**
```sql
-- 连接数据库
mysql -u root -prootx77 fastadmin
-- 执行修复
UPDATE nf_generation_tasks
SET
status = 'failed',
error_msg = '任务处理超时,已自动标记为失败',
updated_at = NOW()
WHERE status = 'running'
AND TIMESTAMPDIFF(MINUTE, updated_at, NOW()) > 10;
```
### 第三步:重启服务
**方法A: 使用重启脚本**
```bash
双击运行: 重启服务.bat
```
**方法B: 手动重启**
1. 在Python终端按 `Ctrl+C` 停止服务
2. 或运行 `杀死端口30101.bat`
3. 重新运行 `启动项目.bat`
### 第四步:验证修复
1. **检查任务状态**
```sql
-- 查看最近的任务
SELECT id, status, error_msg, created_at
FROM nf_generation_tasks
ORDER BY id DESC
LIMIT 10;
-- 确认没有长时间running的任务
SELECT id, status,
TIMESTAMPDIFF(MINUTE, updated_at, NOW()) as stuck_minutes
FROM nf_generation_tasks
WHERE status = 'running';
```
2. **测试新任务**
- 在应用中重新生成唱歌视频
- 观察任务是否正常完成
- 检查视频是否能正常播放
## 问题根源分析
### 1. OSS配置不一致
**问题**
- 配置文件指向 `hello12312312` bucket杭州
- 歌曲音频存储在 `nvlovers` bucket青岛
- 导致下载失败
**影响**
- 任务382: 音频404任务失败
- 任务384: 文件下载失败
**解决**
- 统一使用 `nvlovers` bucket
- 所有资源从同一个bucket读取
### 2. 任务超时未处理
**问题**
- 任务处理时间过长可能是API调用慢
- 没有超时机制
- 任务一直卡在running状态
**影响**
- 任务385: 卡住不动
- 占用系统资源
- 影响后续任务
**解决**
- 手动标记超时任务为失败
- 添加超时监控机制(长期)
## 预防措施
### 1. 统一配置管理
**检查清单**
- [ ] `.env` 文件OSS配置正确
- [ ] `lover/.env` 没有覆盖配置
- [ ] 所有环境使用相同配置
### 2. 添加资源检查
在任务开始前验证资源:
```python
def validate_resources(image_url, audio_url):
"""验证资源是否可访问"""
for url in [image_url, audio_url]:
try:
response = requests.head(url, timeout=5)
if response.status_code != 200:
raise HTTPException(
status_code=400,
detail=f"资源不可访问: {url}"
)
except Exception as e:
raise HTTPException(
status_code=400,
detail=f"资源验证失败: {str(e)}"
)
```
### 3. 添加超时处理
设置合理的超时时间:
```python
# config.py
EMO_TASK_TIMEOUT_SECONDS = 600 # 10分钟
SING_TASK_TIMEOUT_SECONDS = 1800 # 30分钟
TASK_MAX_PROCESSING_TIME = 3600 # 1小时
```
### 4. 定期清理超时任务
创建定时任务:
```python
# 每5分钟检查一次
@scheduler.scheduled_job('interval', minutes=5)
def cleanup_stuck_tasks():
db = SessionLocal()
try:
timeout = datetime.utcnow() - timedelta(minutes=30)
stuck_tasks = (
db.query(GenerationTask)
.filter(
GenerationTask.status == "running",
GenerationTask.updated_at < timeout
)
.all()
)
for task in stuck_tasks:
task.status = "failed"
task.error_msg = "任务处理超时"
db.add(task)
db.commit()
finally:
db.close()
```
### 5. 改进错误日志
记录详细信息:
```python
logger.error(
f"任务 {task_id} 失败: {error_msg}",
extra={
"task_id": task_id,
"user_id": user_id,
"lover_id": lover_id,
"song_id": song_id,
"image_url": image_url,
"audio_url": audio_url,
"error": str(exc),
"traceback": traceback.format_exc()
}
)
```
## 监控指标
### 关键指标
1. **任务成功率**
```sql
SELECT
status,
COUNT(*) as count,
COUNT(*) * 100.0 / SUM(COUNT(*)) OVER() as percentage
FROM nf_generation_tasks
WHERE created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR)
GROUP BY status;
```
2. **平均处理时间**
```sql
SELECT
AVG(TIMESTAMPDIFF(SECOND, created_at, updated_at)) as avg_seconds,
MAX(TIMESTAMPDIFF(SECOND, created_at, updated_at)) as max_seconds
FROM nf_generation_tasks
WHERE status = 'succeeded'
AND created_at > DATE_SUB(NOW(), INTERVAL 24 HOUR);
```
3. **卡住的任务数**
```sql
SELECT COUNT(*) as stuck_count
FROM nf_generation_tasks
WHERE status = 'running'
AND TIMESTAMPDIFF(MINUTE, updated_at, NOW()) > 10;
```
### 告警规则
- 任务成功率 < 80%
- 平均处理时间 > 20分钟
- 卡住的任务数 > 5
- 连续失败任务 > 3
## 常见问题
### Q1: 修复后还是失败?
A: 检查:
1. 服务是否已重启
2. 配置文件是否正确保存
3. 查看新任务的错误信息
### Q2: 如何查看任务详情?
A:
```sql
SELECT * FROM nf_generation_tasks WHERE id = 任务ID\G
```
### Q3: 如何重试失败的任务?
A: 使用重试接口:
```bash
curl -X POST http://192.168.1.141:30101/sing/retry/任务ID
```
### Q4: 如何清理所有失败任务?
A:
```sql
-- 仅查看,不删除
SELECT id, error_msg FROM nf_generation_tasks WHERE status = 'failed';
-- 如需删除(谨慎)
-- DELETE FROM nf_generation_tasks WHERE status = 'failed' AND created_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
```
## 总结
### 已完成
- ✅ 修复OSS配置
- ✅ 创建修复脚本
- ✅ 创建诊断工具
### 待执行
- ⚠️ 清理卡住的任务(运行 `修复卡住的任务.bat`
- ⚠️ 重启服务(运行 `重启服务.bat`
- ⚠️ 测试验证
### 长期改进
- 📋 添加超时处理机制
- 📋 添加资源验证
- 📋 添加定时清理任务
- 📋 改进错误日志
- 📋 添加监控告警
执行完待执行的步骤后,唱歌视频生成功能应该就能正常工作了!