面试官:你能说出几种常见的限流算法?

文章介绍了限流的基本概念和重要性,以及五种常见的限流算法:简单计数器、固定窗口、滑动窗口、漏桶和令牌桶。其中,令牌桶算法适用于应对流量激增,而漏桶则适合稳定请求速率。文章还探讨了Google的RateLimiter实现,它优化了令牌桶的生成策略,避免过多线程。最后,强调了根据业务场景选择合适限流策略的重要性。

1 概述

1.1 什么是限流

限流其实在我们的生活中很常见,例如节假日的热门景区就会通过限售的方式限制景区的容纳游客数量。而在我们的系统服务中,也往往会采取一定措施限制到达系统的并发请求数,使得系统能够正常地处理部分用户的请求,从而保证系统的稳定性。

当然这样的举措不可避免的会造成用户的请求变慢甚至被拒的情况,影响用户体验。因此,限流需要在用户体验和系统稳定性之间做一个平衡。

1.2 什么时候限流

在我们的业务开发中,以下场景往往需要通过限流以保证我们系统的稳定性:

  1. 抢购、大促活动或者热点新闻事件等业务场景往往需要限制最大的请求访问量,防止用户流量的突增影响业务的进行;
  2. 我们对外的数据或文件上传等接口,容易受到爬虫、DDos 等手段的非正常流量攻击,故需要最大恶意的加固服务防止攻击者;
  3. 系统调用的第三方服务时应注意下游服务的稳定性,通过限制自身的请求量以保护下游服务。

2 限流算法

在我们使用较多的限流算法中,大体上可以分为一下五类**:简单计数器**、固定窗口计数器滑动窗口计数器漏桶令牌桶

2.1 简单计数器

简单计数器限流顾名思义,应该是最简单的限流算法了 。在我们的服务中维护一下全局计数器,每当接收一个请求时计数器加一,当请求处理完成后,计数器减一。

public boolean tryAcquire() {
   
   
  if (counter < threshold) {
   
   
    counter++;
    return true;
  }
  return false;
}

public boolean tryRelease() {
   
   
  if (counter > 0) {
   
   
    counter--;
    return true;
  }
  return false;
}

根据计数器存放位置我们又可以分为单机限流(计数器存本地内存)和分布式限流(计数器集中存储,如Redis)。

2.2 固定窗口

固定窗口限流其实也算计数器限流算法的一种,相比简单计数器多了一个时间窗口的概念,计数器每经过一个该时间窗口,就会被重置。

public boolean tryAcquire() {
   
   
  // 获取当前时间
  long now =
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿周周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值