V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
WillingXyz
V2EX  ›  程序员

面试题:秒杀活动,库存无限,怎么设计库存扣减逻辑

  •  
  •   WillingXyz · 2021-03-29 12:39:38 +08:00 · 5361 次点击
    这是一个创建于 1314 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前的面试题,现在突然想起来了。

    我:使用可靠消息发送 MQ (同步写数据库),库存服务消费 MQ 扣减

    面试官:多一次数据库写入,性能低,不行

    我:不扣减库存,秒杀活动结束后,扫描活动期间的所有订单,根据订单中的数据统计库存

    面试官:扫描订单太多,不行

    最后,我问了一下要怎么处理,他说 发 MQ 就行,只要 MQ 服务器不崩就可以。他说他之前是 MQ 存储不够,导致消息发送失败。

    我说万一失败怎么办,他说后面会有对账之类的系统(他们现在没有)。

    所以,到底应该保证事务消息,还是后期处理?

    第 1 条附言  ·  2021-03-29 14:04:51 +08:00
    不好意思,没描述清楚,也不是说真正的库存无限,可以理解为库存很多,理论上卖不完
    19 条回复    2021-03-30 14:18:54 +08:00
    Cowhitewhite
        1
    Cowhitewhite  
       2021-03-29 12:51:36 +08:00
    目前我们系统也做了类似的业务,不做用的 redis 做的扣减
    wangyanrui
        2
    wangyanrui  
       2021-03-29 12:52:12 +08:00 via iPhone
    秒杀的设计方案大体都是削峰,怎么削就要看具体情况了

    这种面试官问的也不太合理
    Lykr
        3
    Lykr  
       2021-03-29 12:57:18 +08:00   ❤️ 2
    库存无限的话为什么还要扣减库存,连一致性都不用保持了。
    我个人的想法是:
    秒杀前把库存无限的商品 ID 先从数据库中提前提取到 Redis 里缓存。
    用户请求到达服务端后连接 Redis 判断一下商品是不是都属于无限库存的,是的话异步发送一个订单生成消息给订单服务然后直接返回成功,消息队列这块还要保证可用性(订单不丢失之类的)。
    Rwing
        4
    Rwing  
       2021-03-29 13:23:58 +08:00
    库存无限的话为什么还要扣减库存
    tabris17
        5
    tabris17  
       2021-03-29 13:26:16 +08:00
    库存无限还减什么库存啊,做加法啊
    securityCoding
        6
    securityCoding  
       2021-03-29 13:30:51 +08:00   ❤️ 3
    秒杀的关键在于动静分离、提前校验。
    1. 根据 db 规格做好进程内限流,预留一倍升级空间。
    2. 静态数据(商品属性)提前预热至缓存,缓存过期时间为秒杀结束时间。
    3. 各种校验提前做,特别是库存校验。
    4. 库存怎么扣减
    - 提前预热库存数据至 redis,原子 DECR 扣减库存,扣减成功 mq 同步 db 库存。
    5. 如何下单?
    - 校验成功通过 mq 抛出下单事件,做好耗时监控,前端页面 hold 一下。
    6. 超时未支付怎么办?
    - 下单成功时抛出抛出延时消息,比如 30 分钟。到期检测订单状态,失败 INCR 把库存还回去。
    7. 如何防刷?
    - uid 固定时间限流
    8. 如何反止链接提前泄露?
    - 产品 id 哈希
    9. 如何反止暴力遍历?
    - 产品 id 经过布隆过滤器校验一下
    reself
        7
    reself  
       2021-03-29 13:34:15 +08:00 via Android
    看到对账,考虑用事件模型?订单请求生成事件,事件一边入库用于对账,另一边入 mq 发起库存扣减、订单生成等事务操作。
    siweipancc
        8
    siweipancc  
       2021-03-29 13:38:46 +08:00 via iPhone
    redis,mq 一把梭:D
    kop1989
        9
    kop1989  
       2021-03-29 13:48:31 +08:00
    这面试官的答案莫名其妙。
    1 、说依赖消息,但怎么证明当前的消息队列 or 缓存一定是正确的(与订单系统结果一致)?
    2 、消息队列出错就去对账(账单 /订单),那不还是和 lz 的事后方案一致?

    所以我支持 lz 的事后撸订单的逻辑。既准确,又安全,还消峰。
    WillingXyz
        10
    WillingXyz  
    OP
       2021-03-29 14:04:34 +08:00
    不好意思,没描述清楚,也不是说真正的库存无限,可以理解为库存很多,理论上卖不完
    xsqfjys
        11
    xsqfjys  
       2021-03-29 14:10:39 +08:00   ❤️ 2
    这面试官水平不高嘴倒是挺硬
    ch2
        12
    ch2  
       2021-03-29 15:06:37 +08:00 via iPhone
    直接下订单不就行了,都不用管超售
    JunoNin
        13
    JunoNin  
       2021-03-29 17:10:49 +08:00
    明知道卖不完。。。为什么还要费时间和空间去管它库存的问题
    xiangbudaomingzi
        14
    xiangbudaomingzi  
       2021-03-29 17:13:17 +08:00
    这个面试官...
    xupefei
        15
    xupefei  
       2021-03-29 17:29:28 +08:00 via iPhone
    每单加一,用单机 mysql 都能撑起来上万并发吧。
    more1sec
        16
    more1sec  
       2021-03-29 17:44:39 +08:00
    库存无限哪来的秒杀,是个单子就能下
    leeg810312
        17
    leeg810312  
       2021-03-30 00:04:32 +08:00 via Android
    面试官问出这么水的问题,你还想去这样的公司吗
    kkbblzq
        18
    kkbblzq  
       2021-03-30 11:53:36 +08:00
    如果库存理论上用不完,感觉可以 redis 计数,定时刷库存
    wshcdr
        19
    wshcdr  
       2021-03-30 14:18:54 +08:00
    秒杀 和 库存无限 是矛盾的...... 面试题有问题...
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2701 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:22 · PVG 20:22 · LAX 05:22 · JFK 08:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.