分布式系统中的限流器是一种重要的技术组件,用于控制和管理系统的流量,防止系统因流量过大而崩溃或性能下降。限流器的主要作用是在保证系统可用性的前提下,对流量进行合理的限制和调度,以保证系统的稳定性和可靠性。
在分布式系统中,限流器通常被部署在系统的入口或关键节点上,用于控制来自外部或内部的请求流量。通过限制流量的速度和数量,限流器可以有效地防止系统因流量过大而出现拥塞或崩溃的情况。同时,限流器还可以对流量进行调度和分配,以保证系统的负载均衡和资源利用率的最大化。
常见的限流算法包括计数器、固定窗口、滑动窗口、漏桶和令牌桶等。其中,计数器是最简单的限流算法,它通过统计请求的数量来进行限流,但缺乏时间概念,容易出现流量突增的情况。固定窗口和滑动窗口算法则引入了时间概念,通过对时间窗口内的请求数量进行限制来实现限流,但可能存在窗口边界的流量突变问题。漏桶和令牌桶算法则通过控制流量的速率来进行限流,可以更好地平滑流量波动。
在实际应用中,限流器还可以结合其他技术手段来提高系统的可用性和性能,如降级处理、请求排队、熔断机制等。当系统流量超过阈值时,可以通过降级处理来减少非关键业务的影响,保证核心业务的正常运行;请求排队则可以将超出阈值的请求放入队列中等待处理,避免直接拒绝请求导致用户体验下降;熔断机制则可以在系统出现异常情况时快速切断请求链路,防止故障扩散和影响整个系统。
限流方法
这里我们主要讨论后端基于请求量的限流,限流是一种非常广泛的应用技术,就比如你在登录系统时,经常会需要你输入手机验证、动态码或一些奇奇怪怪的验证方式, 来降低登录请求的频次。
计数限流
按数量进行控制,达到设置的阈值则进行限流,其中固定窗口,滑动窗口则是通过该方法实现。
固定窗口
通过控制时间单元内允许的请求数量,一旦达到阈值,则不会处理该请求后续相关的业务或者直接让请求快速失败并给予提示。
比如我们配置10s内允许请求的流量为1000,在第1~9s内请求为0,在第9~10秒内的请求数为1000,这样一秒内的请求就达到了1000。当然我们可以时间单元划分成更小粒度, 但是应该多小才合适呢?
问题:只能对时间单元内的总请求数进行控制,当请求集中在较小时间范围内时,无法达到流量限制的效果,因此这是一种粗粒度的流量限制手段
滑动窗口
为了解决固定窗口算法中存在的问题,通过滑动窗口的方法,将上述时间单元划分成多个细粒度的时间窗口,每个窗口都有自己独立的请求计数器,这样就可以让时间单元内的流量控制均匀地 落在各个时间窗口上,同时滑动的时间窗口可以形成连续时间区间控制,并不像固定窗口那样只在两个时间刻度间。
比如时间单元为1s,每个时间窗口为100ms,在1秒内的10个时间窗口可以为09:01:01.000~09:01:02.000、09:01:01.200~09:01:02.800...
问题:滑动窗口的区间划分的越多,则滑动窗口的滚动就越平滑,限流的统计就会越精确,但也需要更多的资源为窗口时间片段保存计数器,从而耗费系统资源
漏桶算法
如果将请求看成水滴,限流器看成一个下面开口的桶(漏桶)。漏桶算法其实就是当水滴(请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大时则会超过桶的可接纳容量, 这时水将直接溢出,漏桶算法能强行限制数据的传输速率。使用漏桶算法,可以保证接口会以一个常速速率来处理请求,所以漏桶算法必定不会出现临界问题。
问题:当短时间内如果有大量的突发请求时,即使服务器负载不高,每个请求也需要等待一段时间(水滴间隔)才能被响应。
总之,分布式系统中的限流器是一种重要的技术组件,它可以帮助系统更好地应对流量压力,保证系统的稳定性和可靠性。在实际应用中,需要根据系统的特点和需求选择合适的限流算法和技术手段,以实现最佳的限流效果。
审核编辑:黄飞
-
计数器
+关注
关注
32文章
2253浏览量
94346 -
限流器
+关注
关注
0文章
41浏览量
14475 -
分布式系统
+关注
关注
0文章
146浏览量
19202
发布评论请先 登录
相关推荐
评论