028-86261949

当前位置:首页 > 技术交流 > 高并发限流策略

高并发限流策略

2018/11/02 16:59 分类: 技术交流 浏览:0

高并发这个概念相信大家都不陌生,而且也是大家今后在面试中经常会问到的知识点,实际开发中,经常也会遇到高并发的情况,如果没有处理好这块,系统可能随时面临雪崩,并且现在系统随着用户量的增加,高并发情形是经常存在的;
 
比如现在比较典型的 淘宝双11购物狂欢节,京东618年中大促,经常用到的功能比如秒杀,抢购,下单,评论等这些都会产生高并发;
 
我们一般应对高并发情况的方案:
缓存 ,降级  和限流
 
缓存:各个系统利用缓存可以提高访问的速度和增大系统的处理容量;降低服务器的压力;
常用处理的缓存比如 redis;
 
降级: 当服务出现一些问题或者整个流程性能受到影响,会使用降级,先中断服务,待问题解决之后,才打开服务,但是不是所有功能都能使用降级;比如 秒杀去抢购一个稀缺资源,这种情况,不能使用降级的服务;
 
限流:对系统的并发数进行限制,或者对请求数进行限制;一旦发现达到最高的阈值之后,系统将跳转错误也,或者让用户进入排队等候的状态;
 
今天在这里主要是给大家介绍限流的策略,常用的限流策略有
计数器 , 令牌桶,漏桶 算法实现限流,下面对各种算法进行说明
计数器算法,这个是最简单的算法,主要是限制总的并发数,比如连接池大小,线程池大小,访问并发数
请看伪代码
if(count > totalLimt){
        Throws newRuntimeException(“请求数已达到上限,请稍后重试”);
}else{
   计算器增加1
   Count++;
}

 

这种方式比较简单,下面的方式稍微复杂一点
令牌桶:
匀速往令牌桶里面添加令牌,比如每秒100个,当桶满的时候,新添加的令牌丢弃,当请求来的时候,从令牌桶中取出令牌,令牌数减少,如果请求过多,没有取到令牌,就必须在缓存里面等待或者丢弃;

 

伪代码实现:京东采用redis+Lua脚本实现抢购限流,加入添加到令牌桶的速度是1秒1个,如果下面伪代码
  1. local key = KEYS[1]   --限流KEY(一秒一个)
  2. local limit = 100        --限流大小
  3. local count = redis.call('get', key)
  4. if count + 1 > limit then
  5. --如果超出令牌桶 限流大小,丢弃或者等待
  6.    return 0
  7. else  
  8. --请求数+1
  9.    redis.call("INCRBY", key,"1")
  10. -- key 2秒之后没有取到,就过期
  11.      redis.call("expire", key,"2")
  12.    return 1
  13. end
复制代码
漏桶算法和令牌桶类似:方向相反,令牌桶是以固定速度流入令牌桶,请求允许突然并发,可以一次处理2个或者3个请求,漏桶算法是以固定速度流出,每次只能处理固定的请求;平滑的处理请求;如下图示意;

 

不管是什么策略,能够解决问题就是好策略,好方案;

 

   感谢源码时代教学讲师提供此文章!
   本文为原创文章,转载请注明出处!
#标签:高并发限流,策略