Skip to content

fix: 修复钉钉机器人长耗时回调导致重复回复的问题#1792

Open
gakki-zone wants to merge 2 commits intochaitin:mainfrom
gakki-zone:fix/dingtalk-duplicate-reply-1791
Open

fix: 修复钉钉机器人长耗时回调导致重复回复的问题#1792
gakki-zone wants to merge 2 commits intochaitin:mainfrom
gakki-zone:fix/dingtalk-duplicate-reply-1791

Conversation

@gakki-zone
Copy link
Copy Markdown

修复说明

修复钉钉机器人在回调处理耗时较长时,可能对同一条消息重复处理并重复回复的问题。

关联 issue:#1791

修改内容

  • 将钉钉回调入口改为快速返回,实际处理放到后台执行
  • 在回调入口增加基于 msg_id 的去重逻辑
  • 处理成功后保留去重标记;处理失败或发生 panic 时清除标记,允许上游重试继续生效
  • 为后台处理增加 recover,避免异常影响进程稳定性
  • 增加对应回归测试

为什么这样修改

这个问题的根因是:当回调处理时间过长时,上游可能重试投递同一条消息;如果没有幂等保护,同一 msg_id 就会被重复消费。

这里没有采用“收到消息后立即永久标记已处理”的方式,而是采用了“先占位、成功后保留、失败则释放”的策略:

  • 收到消息时先按 msg_id 占位,避免并发重复处理
  • 处理成功后保留标记,拦截后续重复投递
  • 处理失败或发生 panic 时清除标记,让上游重试仍然可以补偿这条消息

同时,将实际处理放到后台执行,让回调入口尽快返回,也可以降低因为同步处理耗时过长而触发重试的概率。

验证情况

  • 已通过钉钉消息去重相关定向测试
  • 已通过 API 镜像构建验证

@gakki-zone gakki-zone closed this Apr 22, 2026
@gakki-zone gakki-zone reopened this Apr 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant