Ai_GirlFriend/xuniYou/唱歌视频问题完整解决方案.md
2026-03-02 18:57:11 +08:00

6.6 KiB
Raw Permalink Blame History

唱歌视频问题完整解决方案

问题汇总

问题1: 任务失败 - "文件下载失败"

  • 任务: 382, 384
  • 原因: OSS配置错误使用了错误的bucket
  • 状态: 已修复

问题2: 任务卡住 - 一直running

  • 任务: 385
  • 原因: 任务处理超时,未正确标记失败
  • 状态: ⚠️ 需要手动修复

完整修复流程

第一步修复OSS配置已完成

.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: 使用一键脚本(推荐)

双击运行: 修复卡住的任务.bat

方法B: 手动执行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: 使用重启脚本

双击运行: 重启服务.bat

方法B: 手动重启

  1. 在Python终端按 Ctrl+C 停止服务
  2. 或运行 杀死端口30101.bat
  3. 重新运行 启动项目.bat

第四步:验证修复

  1. 检查任务状态
-- 查看最近的任务
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';
  1. 测试新任务
  • 在应用中重新生成唱歌视频
  • 观察任务是否正常完成
  • 检查视频是否能正常播放

问题根源分析

1. OSS配置不一致

问题

  • 配置文件指向 hello12312312 bucket杭州
  • 歌曲音频存储在 nvlovers bucket青岛
  • 导致下载失败

影响

  • 任务382: 音频404任务失败
  • 任务384: 文件下载失败

解决

  • 统一使用 nvlovers bucket
  • 所有资源从同一个bucket读取

2. 任务超时未处理

问题

  • 任务处理时间过长可能是API调用慢
  • 没有超时机制
  • 任务一直卡在running状态

影响

  • 任务385: 卡住不动
  • 占用系统资源
  • 影响后续任务

解决

  • 手动标记超时任务为失败
  • 添加超时监控机制(长期)

预防措施

1. 统一配置管理

检查清单

  • .env 文件OSS配置正确
  • lover/.env 没有覆盖配置
  • 所有环境使用相同配置

2. 添加资源检查

在任务开始前验证资源:

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. 添加超时处理

设置合理的超时时间:

# config.py
EMO_TASK_TIMEOUT_SECONDS = 600  # 10分钟
SING_TASK_TIMEOUT_SECONDS = 1800  # 30分钟
TASK_MAX_PROCESSING_TIME = 3600  # 1小时

4. 定期清理超时任务

创建定时任务:

# 每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. 改进错误日志

记录详细信息:

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. 任务成功率
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;
  1. 平均处理时间
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);
  1. 卡住的任务数
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:

SELECT * FROM nf_generation_tasks WHERE id = 任务ID\G

Q3: 如何重试失败的任务?

A: 使用重试接口:

curl -X POST http://192.168.1.141:30101/sing/retry/任务ID

Q4: 如何清理所有失败任务?

A:

-- 仅查看,不删除
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
  • ⚠️ 测试验证

长期改进

  • 📋 添加超时处理机制
  • 📋 添加资源验证
  • 📋 添加定时清理任务
  • 📋 改进错误日志
  • 📋 添加监控告警

执行完待执行的步骤后,唱歌视频生成功能应该就能正常工作了!