秒杀系统的设计与实现接口限流方案
Posted 雾晴
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秒杀系统的设计与实现接口限流方案相关的知识,希望对你有一定的参考价值。
接口限流方案
上面那个虽然解决了超卖的问题,但一般秒杀场景都有很多人,可能会出现大规模的请求,势必会对接口服务器造成大量压力,。严重可能会导致服务器宕机,使用便有了接口限流
1、什么是接口限流
所谓接口限流:是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机
2、为什么要接口限流
在面临高并发的抢购请求时,我们如果不对接口进行限流,可能会对后台系统造成极大的压力。大量的请求抢购成功时需要调用下单的接口,过多的请求打到数据库会对系统的稳定性造成影响。
3、如何实现接口限流
常用的限流算法有令牌桶和和漏桶(漏斗算法),而Google开源项目Guava中的RateLimiter使用的就是令牌桶控制算法。在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流
缓存:缓存的目的是提升系统访问速度和增大系统处理容量
降级:降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行
限流:限流的目的是通过对并发访问/请求进行限速,或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或等待、降级等处理。
漏斗算法
思路:露桶算法的思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率
令牌桶算法
令牌桶算法最初来源于计算机网络,在网络传输数据时,为了防止网络拥塞,需要限制流出网络的流量,使流量以比较均匀的速度向外发送,令牌桶算法就实现了这个功能,可以控制发送到网络上数据的数目,并允许突发数据的发送,大小固定的令牌桶可自行以恒定的速率源源不断的产生令牌,如果令牌不被消耗,或者消耗速度小于生产速度,令牌就会不断的增多,直到把桶填满,后面再产生的令牌就会从桶中溢出,最后桶中可以保存的最大令牌数永远不会超过桶的大小。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。
令牌桶的简单使用
依赖
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
既然是接口限流那么就应该是在接口附近使用,我创建一个测试的controller
模式1:1、可以让没有获取到令牌的请求一直阻塞,直到获取到令牌
模式2: 2、设置一个等待时间如果在等待时间内没有获取到令牌则抛弃这个请求
在刚刚的项目中,使用令牌桶算法实现乐观锁+限流
这边可能会出现少买的情况,我们可以把令牌的获取时间延长一点。或者使用上面的模式1(不推荐)
以上是关于秒杀系统的设计与实现接口限流方案的主要内容,如果未能解决你的问题,请参考以下文章