V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
vnex
V2EX  ›  问与答

秒杀的系统设计

  •  
  •   vnex · 2020-05-20 23:13:19 +08:00 · 2307 次点击
    这是一个创建于 1674 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我看,秒杀的一些系统设计,似乎都是根据商品 ID hash 到同一个逻辑节点,然后在逻辑节点里面,排队处理

    那么为什么不是分散到其他节点,基于分布式锁来处理呢?一样可以保证一致性

    目前在想,是不是因为,如果基于分布式锁的话,那么没有抢到锁,只能返回秒杀失败,这样可能导致,商品依旧有库存,但是因为抢的时候,刚好有其他用户抢锁了,导致秒杀失败

    谢谢

    第 1 条附言  ·  2020-05-21 03:06:49 +08:00
    另外一个,就是如果用分布式锁的话,貌似就可以动态扩容了,如果是 hash 到同一个节点,要怎么加机器?新旧请求 hash 到不同节点吗?如果是这样的话,那么像微信抢红包的,520 的时候加一堆机器,要等到 522 凌晨才能释放?有点太浪费了吧?
    9 条回复    2020-05-22 11:15:38 +08:00
    kop1989
        1
    kop1989  
       2020-05-20 23:17:43 +08:00   ❤️ 1
    因为秒杀的关键不是高性能逻辑,是减轻服务器压力。
    单线程排队,甚至是请求抽奖,都是节省服务器压力为目的。并不是为了高效处理队列。
    kop1989
        2
    kop1989  
       2020-05-20 23:22:41 +08:00
    举个不恰当的例子,程序员去大厂面试。为何是排队一个一个面,而不是根据来的人数动态匹配面试官?
    因为对于公司而言,占用 10 个人 30 分钟,和占用一个人 300 分钟,产能影响、面试结果准确度等结果是不同的。
    而最终目的却相同(给一个人发 offer )。
    那作为公司而言为什么要做出对自己不利的面试策略?
    luckyrayyy
        3
    luckyrayyy  
       2020-05-20 23:28:27 +08:00   ❤️ 1
    性能啊,几十万个请求抢一个锁,画美不看。
    EPr2hh6LADQWqRVH
        4
    EPr2hh6LADQWqRVH  
       2020-05-20 23:33:13 +08:00   ❤️ 1
    就随便收集请求 random 一下算了,别跟自己过不去。
    night98
        5
    night98  
       2020-05-20 23:39:23 +08:00   ❤️ 1
    基于分布式锁会存在抢占锁的问题,多个线程等待锁释放耗费的性能也是很高昂的代价,所以直接 hash 到单个节点排队处理,超出队列大小的还能直接返回失败,相比分布式锁会要少很多的内网请求。记住,高并发的原理就是尽可能做最少的事情,能走内存访问的不要走网络访问,能走网络的不要走 io,当然这种场景可以参考下无锁队列进行实现。
    jugelizi
        6
    jugelizi  
       2020-05-21 07:08:59 +08:00 via iPhone   ❤️ 1
    看上去是没趟过分布式锁的坑
    vnex
        7
    vnex  
    OP
       2020-05-21 11:03:30 +08:00
    @jugelizi 介绍指导下 :)
    vnex
        8
    vnex  
    OP
       2020-05-22 07:47:48 +08:00
    @night98 那要如何支持动态扩容呢,如果想加节点,不就要停机维护?

    我看到有介绍说,在连接层,添加一个新的映射关系,老 ID 走老的映射,新 ID 走新的映射

    但是
    像抢红包,红包可以放 24 小时,入会处理峰值时的请求呢?靠单个节点排队吗?
    vnex
        9
    vnex  
    OP
       2020-05-22 11:15:38 +08:00
    @night98 高并发的原理就是尽可能做最少的事情,能走内存访问的不要走网络访问,能走网络的不要走 io,当然这种场景可以参考下无锁队列进行实现。
    感觉这个是指高性能吧

    高并发,应该是 节点无状态+cache+分库分表,读写分离主从
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1229 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 18:07 · PVG 02:07 · LAX 10:07 · JFK 13:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.