MongoDB高并发下的upsert问题

MongoDB高并发下的upsert问题

一、问题现象

运行中心同事报告生产环境日志每天0点附近都会出现几笔错误日志,日志内容截图如下:

二、问题分析

系统采用MongoDB数据库,该表建有groupName+limitKey组合唯一索引,所以分析下来第一感觉就是重复执行insert报duplicate key错误了。

找到对应的业务代码如下:

return mongoTemplate.findAndModify( new Query() .addCriteria(Criteria.where(“limitKey”).is(limitKey)) .addCriteria(Criteria.where(“groupName”).is(groupName)), new Update() .inc(“cnt”, delta) .set(“updateTime”, LocalDateTime.now()) .setOnInsert(“createTime”, LocalDateTime.now()) .setOnInsert(“expireTime”, keepAliveDays == 0 ? null : LocalDateTime.now().plusDays(keepAliveDays)), new FindAndModifyOptions() // 先查询,如果没有符合条件的,会执行插入,插入的值是查询值 更新值 .upsert(true) // 返回当前最新值 .returnNew(true), LimitKeyStatEntity.class);

执行upsert操作,即首先查库里是否已存在记录,存在则执行update更新操作,否则执行insert插入操作。

代码逻辑并未发现有啥问题,但是为啥就报insert冲突了呢?

经上网查询发现,MongoDB本身是有文档级的写入锁的。也就是说,当一个进程开始修改一个文档时,该文档被锁定,其他文档不可以再对其进行写入甚至读取。这个写入锁的存在本身就是为了防止不同程序更新文档时产生的写入冲突。然而,update其实分为两步。首先是搜索文档位置,然后再执行文档更新。

因此MongoDB在高并发的情况下,可能会出现以下问题:

  • 两个线程t1,t2同时update一条记录时
  • t1读,记录不存在;t2读,记录不存在。
  • t1写,执行insert,插入成功
  • t2写,执行insert,由于唯一索引原因,重复插入失败。

再对应查到这几笔累计请求,确实系生产上某个大商户每天0点开始频繁发退货,而且退货间隔时间小到1ms导致的。

三、解决方案

mongoTemplate的findAndModify()方法目前暂无好的办法来解决高并发下上述缺陷,只能从业务方案上来解决。

由于该应用场景为消费订单MQ消息并执行额度累计,因此在写MongoDB异常导致业务上更新累计值失败时,认为消费MQ消息失败并抛出异常,利用RocketMQ消息失败重试机制,重新消费并执行额度累计。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月14日
下一篇 2022年6月14日

相关推荐

  • 任正非喊”活下来"刷屏了

    华为创始人任正非的一篇内部文章,被“第一财经”等多家媒体报道后,刷屏了。 这篇文章,可以概括为华为版的“活下来”。这跟4年前万科董事长郁亮喊出的“活下去”,相互呼应。 万科和华为,…

    2022年8月26日
  • 一套房,6种低成本融资方式

    一套房子,可能对普通人来说就是居住或者投资升值的作用,但是对于做生意的老板来说,房子更大的作用是帮助他获得低成本的资金,能在关键时刻帮助公司度过资金链的难关。 2022年7月20日…

    2022年8月3日
  • 刘伟光:“高质量上云”将为互联网行业带来增长新动能

    来源:人民网 原创稿 某影视渲染公司在云上快速搭建生产制作和云渲染平台,大大缩短制作周期和节约成本实现80%产能复工;某大型互联网公司在云上实现全球五大区同步开服,顶住千万用户同时…

    2022年8月2日
  • Erupt:开源低代码 全栈类 框架,开发后端系统利器,无商用限制

    Erupt简介 Erupt 是一个低代码 全栈类 框架,它使用 Java 注解 动态生成页面以及增、删、改、查、权限控制等后台功能。 零前端代码、零 CURD、自动建表,仅需 一个…

    2022年7月4日
  • 日常生活中,可能导致损坏机械表的 5 种意外方式

    我们的手表一旦出现故障送去维修,可能要花去不小的一笔钱,而且通常需要花费很长的时间,这就是为什么我们总是不断的给大家强调尽可能的在日常生活佩戴中要避免损坏手表的原因。 当然除了故意…

    2022年7月17日
  • 花呗额度被冻结怎么解冻 这些方法可以解冻

    花呗是支付宝中的信贷产品,虽然花呗是可以提前消费,但如果使用不当容易被冻结,当冻结后,要解冻了才能使用。那么花呗额度被冻结怎么解冻?这些方法可以解冻。 如果说用户的花呗额度是被系统…

    2022年10月13日
  • 玩转数据,从指标体系开始

    01前言 你对越刷越上瘾的抖音又爱又恨。 对千人千面淘宝智能推荐的心仪商品满心欢喜。 对踏足一个陌生城市因为有了地图、共享出行以及众多 App 的攻略而不再感到未知和害怕,互联网和…

    2022年6月21日
  • 炬光科技研究报告:进军车载激光雷达的光子专家

    (报告出品方/作者:申万宏源研究,杨海燕,朱型檑,李蕾,黄婷) 1. 尝试运营优化的光子上游专家 1.1 立足激光上游传统业务,进军中游 炬光科技所属行业为激光行业,起家于上游元器…

    2022年6月13日
  • 胡扬忠:AIoT 与安防一样碎片化,海康几乎没有短板

    近日,海康威视总裁胡扬忠出席了投资者会议并对提问进行解答。 2022年上半年,海康营业总收入372.58亿元,比上年同期增长9.90%;实现归属于上市公司股东的净利润57.59亿元…

    2022年8月16日
  • 油价调整消息:跌幅超9%!国内油价再度大跌,8月8日92号汽油限价

    国内油价最新调整消息:现在是北京时间2022年8月8日上午8时,创者堂给大家带来今日油价调整的最新消息,上周刚结束国际油价迎来断崖式下跌,导致国内本想上调的油价被迫改为下跌,明日全…

    2022年8月9日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息