什么,秒杀系统也有这么多种!

2020-05-07 12:57:44 +08:00
 TIGERB

喜大普奔😸😸😸SkrShop 更新了~

喜大普奔😸😸😸SkrShop 更新了~

喜大普奔😸😸😸SkrShop 更新了~

前言

本文结构很简单:

5 张图送你 5 种秒杀系统,再加点骚操作,再顺带些点心里话🤷‍♀️。

一个简单的秒杀系统

实现原理: 通过 redis 原子操作减库存

图一

我们称这类秒杀系统为:

简单秒杀系统

如果刚开始 QPS 并不高,redis 完全抗的下来的情况,完全可以依赖这个「简单秒杀系统」。

一个够用的秒杀系统

实现原理: 服务内存限流算法 + redis 原子操作减库存

图二

我们称这类秒杀系统为:

够用秒杀系统

性能再好点的秒杀系统

实现原理: 服务本地内存原子操作减库存

服务本地内存的库存怎么来的?

活动开始前分配好每台机器的库存,推送到机器上。

图三

我们称这类秒杀系统为:

预备库存秒杀系统

支持动态伸缩容的秒杀系统

实现原理: 服务本地协程 Coroutine定时 redis 原子操作减部分库存到本地内存 + 服务本地内存原子操作减库存

图四

我们称这类秒杀系统为:

实时预备库存秒杀系统

公平的秒杀系统

实现原理: 服务本地 Goroutine定时同步是否售罄到本地内存 + 队列 + 排队成功轮训(或主动 Push)结果

图五

我们称这类秒杀系统为:

公平排队秒杀系统

骚操作

上面的秒杀系统还不够完美吗?

答案:是的。

还有什么优化的空间?

答案:静态化获取秒杀活动信息的接口。

静态化是什么意思?

答案:比如获取秒杀活动信息是通过接口 https://seckill.skrshop.tech/v1/acticity/get 获取的。现在呢,我们需要通过https://static-api.skrshop.tech/seckill/v1/acticity/get 这个接口获取。

以前是这样

变成了这样

结果:可以通过接口https://static-api.skrshop.tech/seckill/v1/acticity/get就获取到了秒杀活动信息,流量都分摊到了 cdn,秒杀服务自身没了这部分的负载。

小声点说:“秒杀结果我也敢推 CDN😏😏😏。”

备注:
之后我们会分享`如何用 Golang 设计一个好用的「接口静态化服务」`。

总结

上面我们得到了如下几类秒杀系统

我想说的是里面没有最好的方案,也没有最坏的方案,只有适合你的。

先到先得来说,一定要看你们的产品对外宣传,切勿上来就追逐绝对的先到先得。其实你看所有的方案,相对而言都是“先到先得”,比如,活动开始一个小时了你再来抢,那相对于准时的用户自然抢不过,对吧。

又如预备库存秒杀系统,虽然不支持动态伸缩容。但是如果你的环境满足如下任意条件,就完全够用了。

所以:

合适好用就行,切勿过度设计。


[Skr Shop] 项目地址长按进入:https://github.com/skr-shop/manuals


SkrShop 系列更多文章:

2882 次点击
所在节点    推广
11 条回复
aliasliyu4
2020-05-07 13:04:52 +08:00
不错
DT37
2020-05-07 13:31:49 +08:00
已收藏
teawithlife
2020-05-07 13:34:04 +08:00
我实在想不出,看这种文章,我能学到什么东西,茴的四种写法么?
qiayue
2020-05-07 13:34:33 +08:00
掘金的图这里显示不了
tulong
2020-05-07 13:43:44 +08:00
图挂了
TIGERB
2020-05-07 14:07:28 +08:00
@teawithlife 各有所取,互相学习么~
sujin190
2020-05-07 14:20:03 +08:00
redis 原子操作扛不住,队列就能抗住这咋想的,虽然很多队列都能横向扩展到数百万写,但是写完了你就不需要处理了么,如果说队列只是削峰,那么异步 io 加 redis 就完了,想那么多有的没的干个啥
TIGERB
2020-05-07 14:30:50 +08:00
@sujin190 嗯 我是从实际业务出发,比如你刚创业、或者新产品 搞个活动就几百几千的 qps 怎么简单怎么解决问题的来么
sujin190
2020-05-07 14:53:25 +08:00
@TIGERB #8 几百!!几千!!!你不是在逗?就这么点,要啥自行车
xy2020
2020-05-07 15:29:24 +08:00
秒杀活动,先到先得不公平?????
TIGERB
2020-05-07 15:57:01 +08:00
@sujin190 所以 就可以直接原子操作了么

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

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

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

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

© 2021 V2EX