高并发系统(缓存、降级、限流)

先解释一下关键词:

缓存:这个大家都知道。

降级:就是在高并发高负载情况下,选择动态的关闭一下不重要的服务,拒绝访问等,来为重要的服务节省资源,比如电商平台秒杀当天可关闭推荐等功能。

限流:就相当于调整水龙头的大小,使得访问请求量控制在一定范围。

       对于比较关键又高并发的服务,比如秒杀,不能通过缓存和降级方式解决,至少不够解决太大并发量。这时候就需要限流了。

以下为参考整理:

限流算法有:令牌桶、漏桶。计数器也可以进行粗暴限流实现。

应用中的限流:比如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

参考:开涛的博客

猜你喜欢

转载自1181731633.iteye.com/blog/2370315