fix(ai-avatar): 修复智能封面接口 502,增大抽帧等待时间+连接池下载+video_url 重签 #1840

Closed
xiaoxia wants to merge 2 commits from fix/smart-cover-502-timeout into develop
Owner

根因分析

智能封面接口 /api/v1/ai-avatar/render/smart-cover 返回 502,排查发现三个问题:

  1. MediaKit 抽帧轮询时间不足:poll_interval=2s, max_poll_attempts=5,最多等 10 秒,大视频或排队场景 MediaKit 尚未完成就被放弃
  2. 帧图片串行下载,无连接复用:5 帧 × 独立 httpx.get(timeout=15s),最坏 75s + persist 再下载 30s ≈ 105s
  3. video_url 可能为私有桶裸 URL:前端传入的 OSS URL 未签名,MediaKit GPU worker 拉取时 403

修复内容

问题 修复
轮询时间不足 poll_interval 2s→3s,max_poll_attempts 5→20(最多等 60s),max_retries 0→1
帧下载慢 改用 httpx.Client 连接池复用,减少 TCP 握手开销
私有桶 URL 不可访问 新增 _sign_video_url_for_mediakit(),自动检测自家 OSS URL 并重签 7 天有效期
异常未兜底导致 502 路由层增加 try/except,异常时返回 fallback 响应而非 502

测试

  • 新增 3 个单测:video_url 重签、外部 URL 透传、轮询参数校验
  • 全部 15 个相关测试通过
## 根因分析 智能封面接口 `/api/v1/ai-avatar/render/smart-cover` 返回 502,排查发现三个问题: 1. **MediaKit 抽帧轮询时间不足**:`poll_interval=2s, max_poll_attempts=5`,最多等 10 秒,大视频或排队场景 MediaKit 尚未完成就被放弃 2. **帧图片串行下载,无连接复用**:5 帧 × 独立 httpx.get(timeout=15s),最坏 75s + persist 再下载 30s ≈ 105s 3. **video_url 可能为私有桶裸 URL**:前端传入的 OSS URL 未签名,MediaKit GPU worker 拉取时 403 ## 修复内容 | 问题 | 修复 | |------|------| | 轮询时间不足 | `poll_interval` 2s→3s,`max_poll_attempts` 5→20(最多等 60s),`max_retries` 0→1 | | 帧下载慢 | 改用 `httpx.Client` 连接池复用,减少 TCP 握手开销 | | 私有桶 URL 不可访问 | 新增 `_sign_video_url_for_mediakit()`,自动检测自家 OSS URL 并重签 7 天有效期 | | 异常未兜底导致 502 | 路由层增加 try/except,异常时返回 fallback 响应而非 502 | ## 测试 - 新增 3 个单测:video_url 重签、外部 URL 透传、轮询参数校验 - 全部 15 个相关测试通过
xiaoxia added 1 commit 2026-09-10 16:23:35 +08:00
fix(ai-avatar): 修复智能封面接口 502,增大抽帧等待时间+连接池下载+video_url 重签
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m32s
AI Code Review / AI Code Review (pull_request) Has been cancelled
PR Automation / Auto Approve on CI Green (pull_request) Has been cancelled
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been cancelled
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 1s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Validate - Style (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Security (pull_request) Has been cancelled
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m16s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m51s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m16s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 49s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 32s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 143h34m42s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 143h35m6s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 143h35m8s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 142h59m54s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 142h59m55s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 143h0m21s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 143h0m21s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 143h34m29s
CI/CD Pipeline / Build Production API Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Web Image (pull_request) Has been cancelled
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been cancelled
CI/CD Pipeline / Deploy Production (pull_request) Has been cancelled
CI/CD Pipeline / Production Browser E2E (pull_request) Has been cancelled
CI/CD Pipeline / Canary Release to Production (pull_request) Has been cancelled
CI/CD Pipeline / CI Gate (pull_request) Has been cancelled
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 143h0m23s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 142h59m42s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 143h0m18s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 142h59m41s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 142h59m46s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 143h0m19s
150dc17273
问题根因:
1. MediaKit 抽帧轮询参数过短(poll_interval=2s, max_poll_attempts=5,最多等 10s),大视频或排队场景下 MediaKit 尚未完成即放弃
2. 帧图片串行下载,每次新建 TCP 连接(httpx.get),5帧×15s 最坏 75s,加上 persist 再下载 30s,总耗时可达 105s
3. 前端传入的 video_url 可能是 OSS 私有桶裸 URL,MediaKit 无法访问导致抽帧失败

修复:
- MediaKit 抽帧参数:poll_interval 2s→3s,max_poll_attempts 5→20(最多等 60s),max_retries 0→1
- 帧下载改用 httpx.Client 连接池复用,减少连接建立开销
- 新增 _sign_video_url_for_mediakit:自动检测自家 OSS URL 并重签 7 天有效期
- 路由层增加 try/except 包裹 generate_smart_cover,异常时返回 fallback 而非 502
- 增加关键路径日志

测试:新增 3 个单测(video_url 重签、外部 URL 透传、轮询参数校验),共 15 测试全过

🚀 预览环境已部署

项目 详情
PR号 #1840
预览链接 https://pr-1840.preview.xiaoxiajianji.com
API环境 staging

💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。

🔄 每次提交新代码后预览环境会自动更新。

🗑️ PR 关闭或合并后,预览环境会自动清理。

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1840 | | 预览链接 | [https://pr-1840.preview.xiaoxiajianji.com](https://pr-1840.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
xiaoxia force-pushed fix/smart-cover-502-timeout from 43c16a3e89 to 150dc17273 2026-09-10 16:57:08 +08:00 Compare
Collaborator

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
xiaoxia force-pushed fix/smart-cover-502-timeout from fb65cb7e6e to 150dc17273 2026-09-10 17:18:46 +08:00 Compare
auto-approve-bot added 1 commit 2026-09-10 17:20:23 +08:00
style: auto-format with black + isort + prettier [skip ci-format-check]
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 38s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 20s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m0s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m2s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m7s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m16s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m20s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m32s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m53s
AI Code Review / AI Code Review (pull_request) Successful in 6m22s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 9m23s
CI/CD Pipeline / CI Gate (pull_request) Successful in 2s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 9m34s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 141h54m3s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 141h54m4s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 141h54m3s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 141h54m4s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 142h2m33s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 142h2m34s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 142h2m34s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 142h2m38s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 142h2m45s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 142h2m45s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 142h3m29s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 142h3m29s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 142h3m30s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 142h3m33s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 142h28m53s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 142h37m34s
1827a1fa49
Collaborator

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.

Auto merge skipped after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually. This is not a CI failure.
xiaoxia closed this pull request 2026-09-10 17:44:49 +08:00

🗑️ 预览环境已清理

PR #1840 已关闭或合并,对应的预览环境已被清理。

如有需要,可以重新打开 PR 来重新生成预览环境。

🗑️ **预览环境已清理** PR #1840 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Some checks are pending
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 0s
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 38s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 20s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m0s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Successful in 1m2s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 1m40s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 2m7s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 2m6s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 2m16s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 2m20s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 2m32s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m53s
AI Code Review / AI Code Review (pull_request) Successful in 6m22s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 9m23s
CI/CD Pipeline / CI Gate (pull_request) Successful in 2s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 9m34s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 30s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 141h54m3s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 141h54m4s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 141h54m3s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 141h54m4s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 142h2m33s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 142h2m34s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 142h2m34s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 142h2m38s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 142h2m45s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 142h2m45s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 142h3m29s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 142h3m29s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 142h3m30s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 142h3m33s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 142h28m53s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 142h37m34s

Pull request closed

Sign in to join this conversation.