嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统

本文结构很简单:5张图送你5种秒杀系统 , 再加点骚操作 , 再顺带些点心里话?♀? 。
一个简单的秒杀系统
实现原理:通过redis原子操作减库存
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
图一
优点:简单好用 , 缺点:考验redis服务能力 。
是否公平:公平 , 先到先得 。
我们称这类秒杀系统为:简单秒杀系统 。
如果刚开始QPS并不高 , redis完全抗的下来的情况 , 完全可以依赖这个「简单秒杀系统」 。
一个够用的秒杀系统
实现原理:服务内存限流算法+redis原子操作减库存
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
图二
优点:简单好用;缺点:- 。
是否公平:不是很公平 , 相对的先到先得 。
我们称这类秒杀系统为:够用秒杀系统
性能再好点的秒杀系统
实现原理:服务本地内存原子操作减库存
服务本地内存的库存怎么来的?
活动开始前分配好每台机器的库存 , 推送到机器上 。
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
图三
优点:高性能 , 释放redis压力;缺点:不支持动态伸缩容(活动进行期间) , 因为库存是活动开始前分配好 。
是否公平:不是很公平 , 不是绝对的先到先得 。
我们称这类秒杀系统为:预备库存秒杀系统
支持动态伸缩容的秒杀系统
实现原理:服务本地协程Coroutine定时redis原子操作减部分库存到本地内存+服务本地内存原子操作减库存 。
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
图四
优点:高性能 , 释放redis压力 , 支持动态伸缩容(活动进行期间) , 具备通用性 。
是否公平:不是很公平 , 但是好了点 , 几乎先到先得 。
我们称这类秒杀系统为:实时预备库存秒杀系统
公平的秒杀系统
实现原理:服务本地Goroutine定时同步是否售罄到本地内存+队列+排队成功轮训(或主动Push)结果
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
图五
优点:高性能 , 真公平具备通用性;缺点:开发成本高(需主动通知或轮训排队结果)
【嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统】是否公平:很公平 , 绝对的先到先得 。
我们称这类秒杀系统为:公平排队秒杀系统
骚操作
上面的秒杀系统还不够完美吗?
答案:是的 。
还有什么优化的空间?
答案:静态化获取秒杀活动信息的接口 。
静态化是什么意思?
答案:比如获取秒杀活动信息是通过接口https://seckill.skrshop.tech/v1/acticity/get获取的 。 现在呢 , 我们需要通过https://static-api.skrshop.tech/seckill/v1/acticity/get这个接口获取 。 有什么区别呢?看下面:
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
以前是这样
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
变成了这样
嘿丝儿科技老本都吐露出来了,5张图送你5种秒杀系统
文章图片
结果:可以通过接口https://static-api.skrshop.tech/seckill/v1/acticity/get就获取到了秒杀活动信息 , 流量都分摊到了cdn , 秒杀服务自身没了这部分的负载 。
小声点说:“秒杀结果我也敢推CDN 。 ”
备注:之后我们会分享`如何用Golang设计一个好用的「接口静态化服务」` 。总结
上面我们得到了如下几类秒杀系统:
秒杀系统简单秒杀系统够用秒杀系统预备库存秒杀系统实时预备库存秒杀系统公平排队秒杀系统我想说的是里面没有最好的方案 , 也没有最坏的方案 , 只有适合你的 。