限流算法

一时失言乱红尘 2022-04-14 03:43 346阅读 0赞

限流算法

限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性。

通常有以下两种限流方案:

  • 漏桶算法
  • 令牌桶算法

漏桶算法

漏桶算法,来自网络.png

漏桶算法非常简单,就是将流量放入桶中并按照一定的速率流出。如果流量过大时候并不会提高流出效率,而溢出的流量也只能是抛弃掉了。

这种算法很简单,但也非常粗暴,无法应对突发的大流量。
这时可以考虑令牌桶算法。

令牌桶算法

令牌桶算法-来自网络.gif

令牌桶算法是按照恒定的速率向桶中放入令牌,每当请求经过时则消耗一个或多个令牌。当桶中的令牌为 0 时,请求则会被阻塞。

note:
令牌桶算法支持先消费后付款,比如一个请求可以获取多个甚至全部的令牌,但是需要后面的请求付费。也就是说后面的请求需要等到桶中的令牌补齐之后才能继续获取。

实例:

  1. @Override
  2. public BaseResponse<UserResVO> getUserByFeignBatch(@RequestBody UserReqVO userReqVO) {
  3. //调用远程服务
  4. OrderNoReqVO vo = new OrderNoReqVO() ;
  5. vo.setReqNo(userReqVO.getReqNo());
  6. RateLimiter limiter = RateLimiter.create(2.0) ;
  7. //批量调用
  8. for (int i = 0 ;i< 10 ; i++){
  9. double acquire = limiter.acquire();
  10. logger.debug("获取令牌成功!,消耗=" + acquire);
  11. BaseResponse<OrderNoResVO> orderNo = orderServiceClient.getOrderNo(vo);
  12. logger.debug("远程返回:"+JSON.toJSONString(orderNo));
  13. }
  14. UserRes userRes = new UserRes() ;
  15. userRes.setUserId(123);
  16. userRes.setUserName("张三");
  17. userRes.setReqNo(userReqVO.getReqNo());
  18. userRes.setCode(StatusEnum.SUCCESS.getCode());
  19. userRes.setMessage("成功");
  20. return userRes ;
  21. }
  1. 单 JVM 限流
  2. 分布式限流

发表评论

表情:
评论列表 (有 0 条评论,346人围观)

还没有评论,来说两句吧...

相关阅读

    相关 算法--sentinel

    见的限流算法 ***计数器算法***计数器算法指在一段时间内,进行计数,与阀值进行比较,如果超过了阀值则进行限流操作,到了时间临界点,将计数器清零进行重新计数,即单位时...

    相关 常见算法

    常见限流算法有以下几种,每一种都有他的优缺点 1. 计数器算法 2. 滑动窗口算法 3. 漏桶算法 4. 令牌桶算法 计数器算法 计数器算法是使用计数器在周期

    相关 浅析算法

    计数器 计数器算法的思想很简单,每当一个请求到来时,我们就将计数器加一,当计数器数值超过阈值后,就拒绝余下请求。一秒钟后,我们将计数器清零,开始新一轮的计数。计数器算法简

    相关 算法

    限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。常用的限流算法有令牌桶法和漏桶法,而Google开源项目Guava中

    相关 算法

    限流算法 限流是解决高并发大流量的一种方案,至少是可以保证应用的可用性。 通常有以下两种限流方案: 漏桶算法 令牌桶算法 漏桶算法 ![漏桶算法,

    相关 算法

    概要 限流目的是通过对并发访问/请求进行限速或者一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务、排队或者等待、降级。 限流算法 常见的限流

    相关 算法

    三种常见的限流算法       在开发高并发系统时,有三把利器用来保护系统:缓存、降级和限流。那么何为限流呢?顾名思义,限流就是限制流量,就像你宽带包了1个G的流量,用完