经典限流算法
经典限流算法
前述
限流算法是一种用于控制流量或请求访问频率的技术,广泛应用于各种场景,以确保系统的稳定性和可用性。
现代互联网很多业务场景,比如秒杀、下单、查询商品详情。这些只是一些限流算法应用的示例,实际上,几乎任何需要控制流量或请求速率的应用都可以从限流算法中受益。选择适当的限流算法取决于具体的需求和系统架构。常见的限流算法包括令牌桶算法、漏桶算法、计数器算法等。
算法详解
计数器算法
计数器算法是一种基于计数器的限流方法。它通过维护一个计数器来记录请求的数量,并与预设的阈值进行比较。
- 当计数器超过阈值时,就会触发限流操作。可以根据需要选择计数器的精度(例如每秒、每分钟等)以及阈值的设置。
缺点:
临界问题:例如在临界两把突发的高峰,无法进行限制。
滑动窗口算法
滑动窗口,又称rolling window。滑动窗口算法维护一个固定大小的时间窗口,通常使用队列或数组来记录请求的时间戳。
- 请求进入窗口时,旧的时间戳会被移出,从而保持窗口内的请求数量在限制范围内。
- 滑动窗口解决了计数器算法的临界值问题。
缺点:
- 不适用于长时间限流:滑动窗口算法通常用于实时或较短时间的限流,例如每秒或每分钟的请求限制。
- 不考虑请求的权重或优先级:滑动窗口算法通常将所有请求视为相等,无法根据请求的权重或优先级进行不同的处理。
- 对于突发流量的适应性有限:滑动窗口算法主要用于平滑流量,但对于突发流量的适应性有限。
漏桶算法
漏桶算法也是一种基于容器的限流算法,它维护一个固定容量的桶,其中请求按照固定速率流入。
- 如果桶已满,新的请求将被拒绝或排队等待。
- 请求从桶中以固定速率流出,确保流量控制在规定速率内。
缺点:
- 不适用于突发流量:漏桶算法的主要目的是通过固定速率来平滑流量,因此不适合处理突发流量。
- 不提供灵活性:漏桶算法的速率是固定的,这意味着它无法根据系统负载或其他因素进行动态调整。
- 无法应对不同优先级的请求:漏桶算法将所有请求平等对待,无法区分不同请求的优先级。
- 可能浪费带宽:如果流量的速率明显低于漏桶的容量,它会强制要求每个请求等待一个固定的时间而浪费带宽。
令牌桶算法
令牌桶算法是一种基于令牌的限流算法,它维护一个固定容量的令牌桶,其中每个令牌表示一个请求的许可。
- 令牌以固定速率被添加到令牌桶中。当请求到达时,必须从令牌桶中获取令牌才能执行请求。
- 如果令牌桶为空,请求将被拒绝或排队等待令牌可用。
总结
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 goMars的学习随记!
评论