最近项目中要用到限流,就做了一些知识的积累。
一、应用级别
1、限制瞬时并发数 ,如nginx的limit_conn模块,用来限制瞬时并发连接数、nginx的limit_req模块,限制每秒的平均速率。
2、限流总并发/连接/请求数
如果你使用过Tomcat,其Connector其中一种配置有如下几个参数:
acceptCount:如果Tomcat的线程都忙于响应,新来的连接会进入队列排队,如果超出排队大小,则拒绝连接
maxConnections:瞬时最大连接数,超出的会排队等待
maxThreads:Tomcat能启动用来处理请求的最大线程数,如果请求处理量一直远远大于最大线程数则可能会僵死
二:服务级别限流
2.1、限流总资源数
可以使用池化技术来限制总资源数:连接池、线程池。比如分配给每个应用的数据库连接是100,那么本应用最多可以使用100个资源,超出了可以等待或者抛异常
2.2、限流某个接口
2.2.1 限流某个接口的总并发/请求数
可以使用AtomicLong、信号量等
2.2.2 平滑限流某个接口的请求数
![](https://img.haomeiwen.com/i5072576/f373ed6b07a1d1bf.png)
![](https://img.haomeiwen.com/i5072576/b5fa2856e464c8ff.png)
根据指定的稳定吞吐率和预热期来创建RateLimiter,这里的吞吐率是指每秒多少许可数(通常是指QPS,每秒多少查询),在这段预热时间内,RateLimiter每秒分配的许可数会平稳地增长直到预热期结束时达到其最大速率(只要存在足够请求数来使其饱和)。同样地,如果RateLimiter 在warmupPeriod时间内闲置不用,它将会逐步地返回冷却状态。也就是说,它会像它第一次被创建般经历同样的预热期。返回的RateLimiter 主要用于那些需要预热期的资源,这些资源实际上满足了请求(比如一个远程服务),而不是在稳定(最大)的速率下可以立即被访问的资源。返回的RateLimiter 在冷却状态下启动(即预热期将会紧跟着发生),并且如果被长期闲置不用,它将回到冷却状态。
2.2.3 分布式限流
分布式限流最关键的是要将限流服务做成原子化,而解决方案可以使使用redis+lua或者nginx+lua技术进行实现
三、限流算法
参考:http://ifeve.com/guava-ratelimiter/
参考:https://blog.csdn.net/wangnan9279/article/details/79287646
网友评论