fix(worker): FFmpeg超时保护 - 防止渲染hang住导致worker永久阻塞 #242

Merged
xiaoxia merged 2 commits from fix/ffmpeg-timeout-protection into develop 2026-07-13 11:07:10 +08:00
Owner

背景

staging上新引擎第一次压测,worker渲染卡死。排查发现新引擎 UnifiedRenderService 所有 FFmpeg 调用通过 run_ffmpeg 执行,但 subprocess.run 未设置timeout,FFmpeg hang住时worker线程永久阻塞。

对比:旧引擎 compose_video 的 subprocess.run 有单独的 timeout=3600,但新引擎路径没有。

根因

  • run_ffmpeg() 无超时参数,subprocess.run 无限等待
  • FFmpeg hang的常见原因:输入文件损坏、特殊滤镜组合死循环、编码异常
  • Celery task 也没有 time_limit 兜底,挂了就永远挂

修复

  1. **run_ffmpeg 新增默认超时 1800s(30分钟),支持自定义传参覆盖
  2. 捕获 subprocess.TimeoutExpired 并打 error 日志后重新抛出
  3. probe_video_info 新增 timeout=15s 超时保护(ffprobe也可能hang)
  4. timeout=None 可禁用(不推荐,留作特殊场景用)

测试

  • 7个单元测试覆盖超时逻辑
  • 现有75个 unified_render_service 测试全绿
  • 格式检查通过
## 背景 staging上新引擎第一次压测,worker渲染卡死。排查发现新引擎 UnifiedRenderService 所有 FFmpeg 调用通过 `run_ffmpeg` 执行,但 `subprocess.run` **未设置timeout**,FFmpeg hang住时worker线程永久阻塞。 对比:旧引擎 compose_video 的 subprocess.run 有单独的 `timeout=3600`,但新引擎路径没有。 ## 根因 - `run_ffmpeg()` 无超时参数,`subprocess.run` 无限等待 - FFmpeg hang的常见原因:输入文件损坏、特殊滤镜组合死循环、编码异常 - Celery task 也没有 time_limit 兜底,挂了就永远挂 ## 修复 1. **run_ffmpeg 新增默认超时 1800s(30分钟),支持自定义传参覆盖 2. 捕获 `subprocess.TimeoutExpired` 并打 error 日志后重新抛出 3. **probe_video_info** 新增 `timeout=15s` 超时保护(ffprobe也可能hang) 4. timeout=None 可禁用(不推荐,留作特殊场景用) ## 测试 - 7个单元测试覆盖超时逻辑 - 现有75个 unified_render_service 测试全绿 ✅ - 格式检查通过 ✅
xiaoxia added 2 commits 2026-07-13 11:05:26 +08:00
- 新增 /internal/render/videos/{video_id}/download-url 接口:单个视频下载URL
- 新增 /internal/render/tasks/{task_id}/videos 接口:任务下所有视频+下载URL
- 内部 API Key 鉴权(X-API-Key),不对外开放
- 下载URL有效期24小时,方便对比工具批量下载
- 支持按 status 筛选(completed/failed 等)
- 8个单元测试覆盖核心逻辑
fix(worker): FFmpeg 超时保护 - 防止渲染 hang 住导致 worker 永久阻塞
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 3m28s
CI/CD Pipeline / Validate Code Quality And Tests (pull_request) Successful in 6m18s
CI/CD Pipeline / Build & Push Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / Build Production Runtime Images (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m0s
aca20d9bf0
根因:新引擎 UnifiedRenderService 所有 FFmpeg 调用通过 run_ffmpeg 执行,
但 subprocess.run 未设置 timeout,FFmpeg hang 住时 worker 线程永久阻塞。

旧引擎 compose_video 有单独的 timeout=3600,但新引擎路径没有。

修复:
1. run_ffmpeg 新增默认超时 1800s(30分钟),支持自定义传参
2. 捕获 TimeoutExpired 并打 error 日志后重新抛出
3. probe_video_info 新增 timeout=15s 超时保护
4. 7个单元测试覆盖超时逻辑

影响范围:所有通过 run_ffmpeg 调用的 FFmpeg 命令
(unified_render_service 所有渲染/混音/合并操作)
xiaoxia force-pushed fix/ffmpeg-timeout-protection from ffed853f6e to aca20d9bf0 2026-07-13 11:05:26 +08:00 Compare
xiaoxia merged commit a0cac1b75d into develop 2026-07-13 11:07:10 +08:00
Sign in to join this conversation.