fix: 预置音色 preview 改为顺序生成,避免 DashScope 429 限流 #1223

Merged
xiaoxia merged 1 commits from fix/preset-preview-sequential into develop 2026-08-03 00:36:08 +08:00
Owner

问题

PR #1222 中使用 ThreadPoolExecutor(max_workers=4) 并行调用 CosyVoice TTS,触发 DashScope API 速率限制(HTTP 429 Throttling.RateQuota),导致所有预置音色的 preview_url 降级为硬编码的过期 URL。

修复

  • 移除 ThreadPoolExecutor,改为 for 循环顺序调用
  • 异常降级从返回空字符串改为返回 p.preview_url(硬编码 fallback)
  • 顺序调用+7天内存缓存:首次请求逐个合成(每个约2-3秒),后续请求直接命中缓存

关联

  • 修复 #1222 引入的限流问题
  • staging 手动部署已验证:动态生成的 URL 与硬编码 URL 完全不同(UUID 和 Expires 均不同)
## 问题 PR #1222 中使用 ThreadPoolExecutor(max_workers=4) 并行调用 CosyVoice TTS,触发 DashScope API 速率限制(HTTP 429 Throttling.RateQuota),导致所有预置音色的 preview_url 降级为硬编码的过期 URL。 ## 修复 - 移除 `ThreadPoolExecutor`,改为 for 循环顺序调用 - 异常降级从返回空字符串改为返回 `p.preview_url`(硬编码 fallback) - 顺序调用+7天内存缓存:首次请求逐个合成(每个约2-3秒),后续请求直接命中缓存 ## 关联 - 修复 #1222 引入的限流问题 - staging 手动部署已验证:动态生成的 URL 与硬编码 URL 完全不同(UUID 和 Expires 均不同)
xiaoxia added 1 commit 2026-08-03 00:28:25 +08:00
fix: 预置音色 preview 改为顺序生成,避免 DashScope 429 限流
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (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 / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 37s
CI/CD Pipeline / Frontend Lint (pull_request) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Has been skipped
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 44s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 54s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m25s
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 1m46s
AI Code Review / AI Code Review (pull_request) Successful in 2m21s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 1m54s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m56s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 2m16s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m23s
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 4m5s
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to 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 1m34s
CI/CD Pipeline / CI Gate (pull_request) Successful in 6s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 42s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 48s
9b933012a8
- 移除 ThreadPoolExecutor 并行调用,改为 for 循环顺序调用
- 并行4路TTS触发 DashScope RateQuota 限流(HTTP 429)
- 顺序调用+内存缓存7天:首次请求逐个合成,后续全部命中缓存
- 异常降级:合成失败时返回硬编码 fallback URL

🚀 预览环境已部署

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

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

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

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

🚀 **预览环境已部署** | 项目 | 详情 | |------|------| | PR号 | #1223 | | 预览链接 | [https://pr-1223.preview.xiaoxiajianji.com](https://pr-1223.preview.xiaoxiajianji.com) | | API环境 | staging | > 💡 预览环境使用 staging API 数据,请勿在预览环境中操作重要数据。 > > 🔄 每次提交新代码后预览环境会自动更新。 > > 🗑️ PR 关闭或合并后,预览环境会自动清理。
Collaborator

代码审查结果 - PR #1223

⚠️ 问题(1个需要修改)

  1. apps/api/app/api/routes/voices.py 第106行:异常处理逻辑变更存在缓存脏数据风险。
    • 原因:原代码在解析失败时返回空字符串 "",新代码改为返回原始值 p.preview_url。结合注释中提到的“结果缓存 7 天”,如果解析失败是因为 p.preview_url 本身无效(如为占位符、相对路径或临时令牌),将这个无效值缓存 7 天会导致用户在长时间内无法获取正确的预览链接,造成功能异常。
    • 后果:可能导致前端播放失败,且错误状态会持续 7 天无法自动恢复。
    • 建议:确认 p.preview_url 在解析失败时是否必定为有效可用的最终 URL。如果不是,应保持返回空字符串或 None,并仅在确认其有效时才回退。

💡 建议(1个可选)

  1. apps/api/app/api/routes/voices.py 第105行:建议增加异常日志记录。
    • 内容:目前的 except Exception 块仅做了值回退,未打印任何日志。如果 API 调用频繁失败(如触发限流或网络问题),运维将无法感知。建议添加 logging.error 记录具体的异常堆栈和 voice_id,便于排查问题。

格式检查通过 | 逻辑审查需修改 | ⚠️ 建议关注性能


🤖 由 AI 代码审查机器人自动生成 | 2026-08-02 16:30:46 | 模型:

## 代码审查结果 - PR #1223 ### ⚠️ 问题(1个需要修改) 1. **apps/api/app/api/routes/voices.py 第106行**:异常处理逻辑变更存在缓存脏数据风险。 - **原因**:原代码在解析失败时返回空字符串 `""`,新代码改为返回原始值 `p.preview_url`。结合注释中提到的“结果缓存 7 天”,如果解析失败是因为 `p.preview_url` 本身无效(如为占位符、相对路径或临时令牌),将这个无效值缓存 7 天会导致用户在长时间内无法获取正确的预览链接,造成功能异常。 - **后果**:可能导致前端播放失败,且错误状态会持续 7 天无法自动恢复。 - **建议**:确认 `p.preview_url` 在解析失败时是否必定为有效可用的最终 URL。如果不是,应保持返回空字符串或 None,并仅在确认其有效时才回退。 ### 💡 建议(1个可选) 1. **apps/api/app/api/routes/voices.py 第105行**:建议增加异常日志记录。 - **内容**:目前的 `except Exception` 块仅做了值回退,未打印任何日志。如果 API 调用频繁失败(如触发限流或网络问题),运维将无法感知。建议添加 `logging.error` 记录具体的异常堆栈和 `voice_id`,便于排查问题。 --- ✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能 --- <sub>🤖 由 AI 代码审查机器人自动生成 | 2026-08-02 16:30:46 | 模型: </sub> <!-- AI_CODE_REVIEW_AUTO_COMMENT -->
xiaoxia merged commit 9ac15d8edc into develop 2026-08-03 00:36:08 +08:00
xiaoxia deleted branch fix/preset-preview-sequential 2026-08-03 00:36:08 +08:00

🗑️ 预览环境已清理

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

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

🗑️ **预览环境已清理** PR #1223 已关闭或合并,对应的预览环境已被清理。 > 如有需要,可以重新打开 PR 来重新生成预览环境。
Sign in to join this conversation.