fix: MediaKit 重试逻辑 + TimeInterval默认策略 + 错误日志增强 #1227
Reference in New Issue
Block a user
Delete Branch "fix/mediakit-retry-reliability-issue1209"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题
MediaKit 服务端偶发
signal: killed(OOM) 导致视频理解/抽帧失败,降级后丢失了智能编排能力。修复
1. 自动重试逻辑
extract_frames和analyze_videos新增max_retries参数(默认 1 次重试)signal: killed、InternalError、OOM)触发重试,间隔 2s2. 默认抽帧策略改为 TimeInterval
extract_frames默认策略从SceneChange→TimeInterval3. 错误日志增强
task_id+error+error_node_with_error轮询方法,返回(result, error_msg)二元组测试
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
analyze_videos方法的poll_interval从 3.0 改为 2.0,max_poll_attempts从 60 改为 15。这导致总超时时间从 180秒(3分钟)骤降为 30秒。视频理解(AI分析)通常属于耗时任务,30秒的超时时间极短,极易导致正常请求因处理时间稍长而误报为超时失败。extract_frames的超时时间为 60秒(2.0*30),视频理解的耗时通常不应低于抽帧。💡 改进建议(不阻塞合并)
[packages/shared/mediakit_client.py: 396] 轮询异常处理会绕过重试机制
_poll_task_result_with_error和_poll_video_understand_result_with_error方法中,except Exception捕获异常后会记录日志并sleep,然后继续循环。这会消耗max_poll_attempts次数。如果因网络抖动导致多次异常,最终会返回“超时”错误。而外部重试逻辑判断“超时”字符串为不可重试错误(_is_retryable_error返回 False),从而导致任务直接失败,无法利用max_retries进行重试。建议将异常信息传递出去,或者在超时错误信息中区分是“处理超时”还是“网络异常”。[packages/shared/mediakit_client.py: 26] 错误关键词匹配存在误报风险
_RETRYABLE_ERROR_KEYWORDS中包含"OOM"。该字符串较短,可能匹配到非预期的单词(如 "BOOM", "ROOM")。虽然概率较低,但建议使用更精确的关键词如" out of memory "(带空格)或"memory oom",以避免误判。[packages/shared/mediakit_client.py: 88-119] 重复代码
extract_frames和analyze_videos中的重试循环逻辑(for attempt in range...)几乎完全一致。建议提取一个通用的重试装饰器或辅助方法(如_execute_with_retry),以减少代码重复,提高可维护性。✅ 良好实践
test_mediakit_retry.py,覆盖了重试逻辑、错误分类和默认策略,测试覆盖度较好。_is_retryable_error明确区分了可重试与不可重试错误,避免了盲目重试。_poll_task_result)以兼容可能的旧调用,向后兼容性处理得当。🤖 由 AI 代码审查机器人自动生成 | 2026-08-03 05:44:39 | 模型:
🗑️ 预览环境已清理
PR #1227 已关闭或合并,对应的预览环境已被清理。