应用内限流
应用级限流主要可以分为以下几种:
限制整个应用的并发请求数
限制总资源数
限制某个接口的总请求数
限制某个接口的时间窗请求数
平滑某个接口的请求
限制整个应用的并发请求数
对于一个应用而言,一定会有极限并发请求数,即总有一个TPS/QPS阈值。如果并发请求数量超过了阈值,应用就会不响应请求或响应地很慢,因此我们要对应用进行过载保护,防止大并发请求突然涌入击垮应用。
如果使用Tomcat作为应用服务器,它的Connector中有几下几个配置项:
acceptCount:如果tomcat线程都忙于响应,则新来的连接会进入队列排队;如果超过队列大小,则拒绝连接;该参数就是指允许的队列的大小。
maxConnections:瞬时最大连接数,超出的请求会排队等候。
maxThreads:tomcat能启动用来处理请求的最大线程数,其实就是Tomcat允许的最大并发请求数。如果请求处理量一直大于该值,则会引起响应变慢甚至僵死。
限制总资源数
对于数据库连接、线程等稀有资源,可以使用池化技术来限制总资源数,如连接池、线程池。
限制某个接口的总请求数
如果某个接口可能有突发访问情况,但又担心并发请求太高造成崩溃,那么这个时候可以对这个接口进行总请求数的限制。
这种场景主要是:
抢购:超过限额,则让用户等待或告知用户无货
开放平台:限制用户某个接口的试用请求量
可以使用计数器算法来解决该问题,参考代码如下:
测试代码