feat(worker): 手动查重 worker task + visual_similarity/match_count 字段 #1661 #1679
Reference in New Issue
Block a user
Delete Branch "feat/manual-dup-check-worker-1661"
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?
背景
Issue #1661:手动查重上传后记录一直 pending —— 上传/重试接口只建了 DuplicationRecord,没有任何 worker 跑计算。本 PR 补全完整处理链路。
改动
1. 新增 Celery task
worker.process_duplication_checkapps/worker/worker_app/tasks/duplication_check.py:VideoDeduplicator.compute_fingerprint()(动态抽帧+分片指纹)compute_duplicate_rate(scope="user")跨项目与用户所有已有成片比对 → duplicate_rate/visual_similarity/match_countfind_duplicate_segments()分片级滑动窗口时序匹配 → 重复片段定位2. 状态与重试
3. 字段补全
DuplicationRecord实体新增visual_similarity: float | None、match_count: int | None(默认 None,向后兼容)mark_completed()签名同步加两个参数;reset_for_retry()同步清空065_dup_record_sim_match:duplication_records 表加两列DuplicationRecordResponse/DuplicationDetailResponse新增两字段,路由透传4. 片段单位映射
worker 分片
DuplicateSegment(ms + 平均汉明距离)→ 领域DuplicateSegment(秒 + 0-100 相似度百分比),与前端 SegmentCard 消费格式一致。5. 路由 enqueue
POST /duplication/upload建记录后send_task("worker.process_duplication_check")POST /records/{id}/retry重置后重新 enqueue测试
注意
🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
process_duplication_check函数的except Exception块中,raise self.retry(...)语句位于if self.request.retries >= self.max_retries判断块之外。这意味着即使任务已经达到最大重试次数(max_retries=3)并将记录标记为 "failed",代码仍然会执行最后的raise self.retry,导致 Celery 继续重试该任务,造成无限循环或超出预期的重试行为。raise self.retry(...)移入else分支,或者仅在未达到最大重试次数时执行重试。当retries >= max_retries时,应直接返回或抛出非 Retry 异常以结束任务。💡 改进建议(不阻塞合并)
[apps/worker/worker_app/tasks/duplication_check.py: 54] 访问受保护成员
deduplicator._get_existing_chunks(...),访问了类的 protected/private 成员(以下划线开头)。这违反了封装原则,如果库内部实现变更,会导致代码运行时错误。建议确认是否有公开 API 可用,或与库维护者沟通。[apps/worker/worker_app/tasks/duplication_check.py: 66] 魔法数字硬编码
avg_sim = 1.0 - raw.avg_distance / 64.0。这里的64.0是一个魔法数字,可能代表距离的最大值或归一化因子。建议将其定义为常量(例如MAX_DISTANCE = 64.0)或从配置/类属性中获取,以提高代码可读性和可维护性。✅ 良好实践
getattr兼容新旧字段,确保在数据库迁移未执行时旧代码仍能运行。tempfile.mkdtemp)的清理,使用了finally块确保资源释放。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ⚠️ 建议关注性能
🤖 由 AI 代码审查机器人自动生成 | 2026-09-03 17:24:06 | 模型:
🗑️ 预览环境已清理
PR #1679 已关闭或合并,对应的预览环境已被清理。