先解释一下关键词:
缓存:这个大家都知道。
降级:就是在高并发高负载情况下,选择动态的关闭一下不重要的服务,拒绝访问等,来为重要的服务节省资源,比如电商平台秒杀当天可关闭推荐等功能。
限流:就相当于调整水龙头的大小,使得访问请求量控制在一定范围。
对于比较关键又高并发的服务,比如秒杀,不能通过缓存和降级方式解决,至少不够解决太大并发量。这时候就需要限流了。
以下为参考整理:
限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现。
应用中的限流:比如TPS/QPS超过一定范围,进行控制,比如tomcat可配置可接受的等待连接数、最大连接数、最大线程数等。
资源池化,然后超出限制等待请求资源数,就直接返回失败即可。
限制每时每分每秒的访问请求数,可通过一个cacheMap<Long, AtomicLong>来实现,key为当前时间long值除以相应数。以下开涛的实现,用Guava的Cache,设置过期时间,LFU最近最少使用的元素会被删除:
LoadingCache<Long, AtomicLong> counter =
CacheBuilder.newBuilder()
.expireAfterWrite(2, TimeUnit.SECONDS)
.build(new CacheLoader<Long, AtomicLong>() {
@Override
public AtomicLong load(Long seconds) throws Exception {
return new AtomicLong(0);
}
});
long limit = 1000;
while(true) {
//得到当前秒
long currentSeconds = System.currentTimeMillis() / 1000;
if(counter.get(currentSeconds).incrementAndGet() > limit) {
System.out.println("限流了:" + currentSeconds);
continue;
}
//业务处理
}
接入层限流:指请求流量的入口,该层的主要目的有:负载均衡、非法请求过滤、请求聚合、缓存、降级、限流、A/B测试、服务质量监控等等。Nginx接入层限流可以使用Nginx自带了两个模块:连接数限流模块ngx_http_limit_conn_module和漏桶算法实现的请求限流模块ngx_http_limit_req_module
参考:开涛的博客