秒杀系统主要有以下特点
1、高并发瞬时流量
2、热点数据
3、数据量大
4、库存的正确扣减
5、黄牛抢购
6、重复下单
7、对普通交易的影响
前后端缓存
首先是秒杀功能的开启,以及前端资源的访问,这部分内容一般都是提前放到CDN中,让这些静态资源离用户更近就能让用户访问的更快
秒杀系统,会在前端,也就是客户端层面做一些请求的随机丢弃,这些被丢弃的请求就直接返回失败,或者系统繁忙,让用户重试。过滤掉一部分流量向服务端发送
可以配置一些黑白名单、可以通过IP进行限流、也可以做一些业务校验都是可以的
服务器层面也是配置很多限流策略的,基于sentinel,或者自己实现一些限流算法,都是可以做动态限流的
还有就是,服务器中有一些查询操作,和一部分写操作,其实是可以用缓存来抗一下的。在缓存上本地缓存要比分布式缓存的性能更高,近端缓存要好于远端缓存
数据预热
秒杀系统另外一个比较典型的特点就是会存在热点数据,因为大家都会抢购同一件商品,那么这个商品就会变成热点数据。秒杀是可以提前预知哪些数据会变成热点的,所以可以提前做一些缓存的预热,对于热点数据,不仅需要在Redis中做预热,还需要在本地缓存也做预热,避免Redis的热key问题。
数据量大
这时候就可以考虑要么就加缓存、要么就用ES、要么就做分库分表。还有就是做数据归档,把历史数据归档掉,无非就是这么几个方案了。
库存扣减
可以利用redis单线程特性,进行库存扣减,发送MQ同步数据库,减少因加锁带来的线程等待问题
黄牛抢购
根据用户的IP、设备信息、网络信息、行为数据等进行分析,推断哪些是黄牛
这部分用户的ID直接可以加入黑名单中,除了用户ID以外,还需要对他的IP地址、设备等进行限流,比如限制某个IP一段时间内只能下单几次,基于令牌桶、漏桶等限流算法都能实现。我们也可以直接借助nginx、 sentinel、guava等进行限流的实现
重复下单
加redis分布式锁
对普通交易的影响
按照业务量做隔离措施,逻辑隔离(业务代码拆分)或者物理隔离(服务器拆分)
业务手段
有的时候,我们不能只想着用技术手段解决所有问题,其实,如果在业务上能做点事情的话,如果这些做法并不影响用户体验,那么就可能让技术实现上大大简化方案,整个系统的成本和稳定性也会有大大的提高。
比如我们前面说的限购
再比如说,在有些秒杀业务中,需要先预约,预约通过后才能参与秒杀,这就大大的降低了秒杀时的请求量了。
再比如说很多电商最近再搞一些预售的功能,其实也是有这方面的考虑的。
还有就是秒杀时通过一些验证码、问题等,也可以降低瞬时的高并发流量,