秒杀的系统设计

2020-05-20 23:13:19 +08:00
 vnex

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

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

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

谢谢

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

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

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

高并发,应该是 节点无状态+cache+分库分表,读写分离主从

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/673803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX