美文网首页
3. 异步扣库存的问题

3. 异步扣库存的问题

作者: 呆叔么么 | 来源:发表于2020-05-27 21:30 被阅读0次

在上面的文章中,我们实现了异步扣库存,但是还是存在问题。

1.超卖问题的解决

在原来单体架构的过程中,我们可以使用redis锁,实现超卖问题的解决

    @Override
    public Integer decreaseStock(List<OrderItem> orderItemList) {
        /**
         * 加锁
         */
        int count = 0;
        for (OrderItem orderItem: orderItemList) {
            /**
             * 加锁
             */
            long time = System.currentTimeMillis() + TIMEOUT;
            if(!redisLock.lock(orderItem.getGoodsId().toString(), String.valueOf(time))){
                throw new LovingMallException(ExceptionCodeEnum.SYSTEM_BUSY);
            }
            GoodsInfo goodsInfo = goodsInfoMapper.selectByPrimaryKey(orderItem.getGoodsId());
            if(goodsInfo == null){
                throw new LovingMallException(ExceptionCodeEnum.PRODUCT_NOT_EXIT);
            }
            Integer resultStock = goodsInfo.getStockNum() - orderItem.getGoodsCount();

            if(resultStock < 0){
                throw new LovingMallException(ExceptionCodeEnum.STOCK_WARN);
            }
            goodsInfo.setStockNum(resultStock);
            count += goodsInfoMapper.updateByPrimaryKeySelective(goodsInfo);
            /**
             * 解锁
             */
            redisLock.unlock(orderItem.getGoodsId().toString(),String.valueOf(time));
        }
        return count;
    }
        // 6.扣库存
        count = goodsInfoService.decreaseStock(orderDTO.getOrderItemList());
        if(count > 0){
            return ServerResponse.createBySuccessMessage("下单成功");
        }else {
            throw new LovingMallException(ExceptionCodeEnum.STOCK_WARN);
        }

现在微服务架构下,redis锁,已经不再适合,因为消费者(product)消费消息(message)的时间是不确定的。
推荐方法:

慕课网廖师兄提供

相关文章

  • 3. 异步扣库存的问题

    在上面的文章中,我们实现了异步扣库存,但是还是存在问题。 1.超卖问题的解决 在原来单体架构的过程中,我们可以使用...

  • 超卖——⽅案

    1. ⾸先查询redis缓存库存是否充⾜ 2. 先扣库存再落订单数据,可以防⽌订单⽣成了没有库存的超卖问题 3. ...

  • 2. springCloud Stream 实现异步扣库存

    一.原扣库存逻辑 二.使用SpringCloud Stream 异步下单 order服务 product服务 即可...

  • 并发扣库存问题总结

    无论是日常工作中,还是面试问题中,并发扣库存都是一个很常见的场景,正好业务里有这样的场景,可以对这类问题做一下总结...

  • 扣库存

    1. 事务+锁 只适合单体应用 (1)MySQL默认事务隔离级别为可重复读,即1个事务多次读取同1条...

  • 扣库存的方案

    扣库存的场景及问题 扣库存是电商系统里一个非常基础的操作。 在业务上,它必须要能达到: 不超卖 重试时,不出现假卖...

  • 基于mq的异步分布式事务方案

    商城下单场景:下单->减库存->扣费很容易想到利用mq来异步解决,先上一段伪代码 这段程序的貌似是可以完成任务的。...

  • SpringCloud微服务实战(七)-消息服务在电商中的实践

    6 商品和订单服务中使用MQ(上) 6.1 同步 在订单生成的时候直接扣库存,这是最初等的方式扣库存,这种方式比较...

  • 并发下的库存如何扣?

    并发下的库存如何扣? 背景 业务反馈,项目出现库存超卖/负值现象。 原因 假设库存为5,用户一次买了1个,于是库存...

  • PHP 高并发情况的简单模拟,thinkphp

    看下面代码,一个简单的减库存模拟. 一,并发扣库存 1.原始数据里面有100个库存 2.下面进行减库存操作,代码如...

网友评论

      本文标题:3. 异步扣库存的问题

      本文链接:https://www.haomeiwen.com/subject/krrcgctx.html