面试题:秒杀活动,库存无限,怎么设计库存扣减逻辑 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
WillingXyz
V2EX    程序员

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

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

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

    我:使用可靠消息发送 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     Solana     3067 人在线   最高记录 6679     &bsp; Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 90ms UTC 12:40 PVG 20:40 LAX 04:40 JFK 07:40
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86