• 新世界
    2020-12-07
    一般秒杀场景 用redis 扣减库存,不去保证原子性,扣减后有可能超卖,再用数据库去保证最终不超卖,因为超卖的不会多,能够打到mysql的操作就是超卖+实际库存,所以mysql压力也会比较少 课后习题: redis的 800个库存,分布到4个server上,打到哪个server上,取决于key,如果key分布不均匀,会导致 一定的不公平,就像高考一样,有的地方考生多,有的地方考生少,虽然在每个省中录取名额一样,但是也不公平

    作者回复: 高考的比喻很形象!

    共 4 条评论
    21
  • Geek_f6a7c7
    2020-12-04
    不是一个好方案,一个商品库存数切片不同实例存储的确可以减少单个实例的压力,但是在业务上可行性有待商榷,如果当前切片实例没有库存,是不是要再请求别的切片实例?特别是库存数都被抢购完成后,后面的请求是不是都要请求4个切片节点做库存数的聚合才知道又没人退货,做库存数的聚合?

    作者回复: 分析的不错。使用切片后,处理逻辑要考虑分布式的数据情况了,变得复杂了。

    共 2 条评论
    13
  • 花轮君
    2020-11-13
    设计上是可行的,将秒杀请求也进行分片,库存的校验可以按照分库顺序扣。

    作者回复: 请求分片的均衡度会比较难控制,另外,如果按照分库顺序扣的话,那么设计四个分片期望达到的支持并发扣减库存的目标就达不到了。

    
    8
  • 曾轼麟
    2020-11-20
    我个人认为这个方式不是很好,因为单个sku分开后,需要对用户的请求做路由判断,假如一个用户请求本身就发出了两条,按照随机路由的方式,他有可能在两个切片中抢到商品。假如路由规则是固定的,那么会出现sku还有库存,但是用户就是抢不到的情况

    作者回复: 这里的关键技术挑战就是:请求分发规则和库存分布式查询。

    
    4
  • 范闲
    2020-12-03
    如果秒杀请求能够比较均匀的分别打到4个实例上是没有问题的。 这个时候不返回剩余库存,不做聚合,能大幅度提高速度。

    作者回复: 关键是这个假设不一定能实际做到。。。

    共 2 条评论
    3
  • yyl
    2020-11-22
    将800个商品均分至4个实例,并不能保证客户端请求被均分至不同的实例;毕竟用户的行为是无法预测的,有可能出现某个实例的请求量比较大

    作者回复: 这是个关键因素。 而且如果某个实例上的库存扣除完了,并不代表所有库存都扣完了,这时要想判断是否还有库存,就要去其他实例查询,逻辑就复杂了。

    
    
  • @%初%@
    2020-11-16
    我觉得,是可行的,主要要考虑最后的余量怎么处理,0~2个分片上有余量,而3号分片上有余量,这样怎么处理,还有,就是最后的用余量足够,而每个分片的余量不够,这个又怎么去处理,我觉得这些处理好了,分片存储可以考虑使用。

    作者回复: 这种情况下余量查询的逻辑就比较复杂了,会增加查询请求的分发复杂度,反而可能会得不偿失。

    
    
  • tt
    2020-11-13
    每个实例200个库存,当某个请求在某个实例上查询不到库存时,并不是库存真的为0了,还需要去其它实例查询,这个是一个缺点。 好处时可以承受更大的流量。

    作者回复: 查询逻辑会变得比较复杂了。

    
    
  • Kaito
    2020-11-13
    使用多个实例的切片集群来分担秒杀请求,是否是一个好方法? 使用切片集群分担秒杀请求,可以降低每个实例的请求压力,前提是秒杀请求可以平均打到每个实例上,否则会出现秒杀请求倾斜的情况,反而会增加某个实例的压力,而且会导致商品没有全部卖出的情况。 但用切片集群分别存储库存信息,缺点是如果需要向用户展示剩余库存,要分别查询多个切片,最后聚合结果后返回给客户端。这种情况下,建议不展示剩余库存信息,直接针对秒杀请求返回是否秒杀成功即可。 秒杀系统最重要的是,把大部分请求拦截在最前面,只让很少请求能够真正进入到后端系统,降低后端服务的压力,常见的方案包括:页面静态化(推送到CDN)、网关恶意请求拦截、请求分段放行、缓存校验和扣减库存、消息队列处理订单。 另外,为了不影响其他业务系统,秒杀系统最好和业务系统隔离,主要包括应用隔离、部署隔离、数据存储隔离。
    共 22 条评论
    208
  • Dovelol
    2020-11-14
    老师好,想问下,用redis扣库存直接用HINCRBY已秒杀库存量,判断返回值>=总库存就是没库存,小于总库存就是扣减库存成功可以购买,这样判断有什么问题么?为什么要引入lua脚本来增加复杂度呢?
    共 37 条评论
    22