From cb9d04648cb94e63a20a39619afc2ffbb7616e84 Mon Sep 17 00:00:00 2001 From: qhd <1766646056@qq.com> Date: Sat, 22 Aug 2026 08:26:43 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=A1=AE=E4=BF=9D=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E7=BB=93=E6=9D=9F=E9=87=8A=E6=94=BE=20Redis=20=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 将 Redis 锁的删除从成功路径移动到 defer,保证任务无论成功失败都会释放锁,避免失败时残留锁导致任务在 TTL 内无法被重新获取。 --- service/model_task_end_service.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/service/model_task_end_service.go b/service/model_task_end_service.go index 9e4e781..1c6d9b9 100644 --- a/service/model_task_end_service.go +++ b/service/model_task_end_service.go @@ -126,6 +126,13 @@ func (s *modelTaskEndService) handleSingleTask(ctx context.Context, item *entity UserName: item.Creator, TenantId: item.TenantId, }) + // 任务处理结束(无论成功失败)都释放 Redis 锁,避免失败路径残留锁、 + // 在锁 TTL(1200s)内阻塞任务被其他 worker 重新获取 + defer func() { + if _, delErr := g.Redis().Del(asyncCtx, "model_video_task:"+gconv.String(item.Id)); delErr != nil { + g.Log().Errorf(asyncCtx, "清理任务锁失败: %v", delErr) + } + }() // 按 modelId 现查模型配置(异步映射/token 映射/计费规则不随任务快照,任务完成时取当前配置) modelInfo, err := dao.ModelManage.GetNotTenantId(asyncCtx, &dto.GetModelManageReq{Id: item.ModelId}) if err != nil { @@ -241,11 +248,6 @@ func (s *modelTaskEndService) handleSingleTask(ctx context.Context, item *entity if err != nil { g.Log().Errorf(asyncCtx, "保存视频任务结果失败: %v", err) } - // 删除redis视频任务 - _, err = g.Redis().Del(asyncCtx, "model_video_task:"+gconv.String(item.Id)) - if err != nil { - return - } // 发布消息 if err = TaskMsgPublish(asyncCtx, item.MsgTopic, docMsg); err != nil { g.Log().Errorf(asyncCtx, "模型消息发布失败: %v", err)