You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Express & MongoDB使用Axios请求时偶发相同时间戳重复文档原因排查

问题原因分析与解决方案

可能的触发场景

  • 同步函数并发执行:如果syncExams函数被重复触发(比如定时任务重复调度、事件回调被多次执行、多实例部署时无分布式锁),多次执行会同时查询到isSynchronized: false的同一条exam记录,各自向后端发送POST请求,就会创建两份时间戳完全一致的文档。
  • Axios重复发请求:如果Axios实例配置了重试规则(比如使用axios-retry插件),或网络波动导致第一次请求的响应未正常返回客户端,Axios会自动发送第二次相同请求,后端无幂等校验的情况下就会生成两条重复记录。
  • Mongoose eachAsync 并发问题:eachAsync默认并发数为10,如果遍历过程中逻辑异常导致同一条exam被重复处理,也会触发重复请求。
  • 可以排除mongoose-timestamp2插件bug的可能性:该插件仅在文档执行save操作时赋值当前时间戳,两次独立save操作生成完全相同时间戳的概率极低,只有同时触发两次文档创建才会出现时间戳一致的情况。

修复建议

  1. 同步逻辑加锁:执行syncExams前先加进程锁/分布式锁,保证同一时间只有一个执行实例在处理同步任务,避免并发查询到同一条未同步的记录。
  2. 优化同步状态流转:查询到未同步的exam后,先将其标记为同步中状态再发请求,处理完成再标记为已同步,避免其他执行实例拿到同一条记录重复处理。
  3. 后端接口加幂等校验:不要直接删除前端传递的原文档_id,可以在后端exam schema中新增单独字段比如originalClientId存储前端原文档_id,给该字段加唯一索引,收到请求时先判断是否存在对应originalClientId的文档,存在则直接返回已有数据不重复创建。
  4. 检查Axios配置:确认是否开启了自动重试,如果有重试需求可以配合幂等键使用,避免重复请求生成重复数据。

内容的提问来源于stack exchange,提问作者Ahmed Gamaleldin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 04:06:03