前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何选择限流算法

如何选择限流算法

原创
作者头像
onlyice
发布2019-02-23 21:25:50
1.9K0
发布2019-02-23 21:25:50
举报
文章被收录于专栏:编程之美编程之美

「服务限流」通过限制每个用户调用 API 的频率来保护服务不被过度调用。在没有限流的情况下,每个用户可以随意请求服务 API,这可能引起流量尖峰导致其他用户的请求无法被处理。启用服务限流后,可以限制 API 每周期可被调用的次数。

不同的限流算法有其相应的优缺点。下面文章会详细描述它们各自的优缺点及适用场景。

漏斗算法

漏斗算法类似一个先进先出队列。如下图所示,每个请求类似水滴加入到一个漏斗桶中。漏斗会以恒定速率将水滴漏出,这个过程表示请求被处理。

[ 漏斗算法 ]
[ 漏斗算法 ]

漏斗模型的好处是,它的实现很简单,而且对后端的负载是恒定的。但是问题是它无法解决有突增流量的情况。这些突增的请求会在队列中呆很长时间才被处理,这个时间请求的前端可能已经超时。

固定窗口算法

[ 固定窗口算法 ]
[ 固定窗口算法 ]

固定窗口算法可以部分解决流量突增的问题。它不像漏斗算法一样,按恒定的速率去处理请求,而是只要在固定的时间周期内不超过限额即可。这样可以应对流量突增的问题。但是它的问题是,如果当前请求量已经超过限额,那么只有每次周期开始的前段时间中进来的请求会被处理,而后端时间由于已达到限额而拒绝处理请求。这会导致系统的负载不均匀,都压在了周期前段时间。

滑动窗口算法

[ 固定窗口 对比 滑动窗口 ]
[ 固定窗口 对比 滑动窗口 ]

滑动窗口算法与固定窗口算法的不同点在于,滑动窗口的周期起止时间是浮动的。对于同样实际请求量大于限额的情况,滑动窗口算法会使得高峰不会出现在固定的周期开始时间点,而是会有所浮动。这会使系统的整体负载更加均匀。

令牌桶算法

[ 令牌桶算法 ]
[ 令牌桶算法 ]

令牌桶算法的模型如下:

  • 每次处理请求前,先从令牌桶尝试拿出一个令牌,如果拿到,则可以处理该请求;否则拒绝该请求
  • 新的令牌会匀速地充入令牌桶中,单位时间的流量限额决定了令牌桶的大小和充入的速率

令牌桶的这种特性使得它对于突增流量,能够以较平缓地方式去处理,从而使整体系统的负载最为均匀。

总结

如果你的系统没有突增流量,对于流量绝对均匀有很强的要求,使用漏斗算法。

如果你的系统有少量突增流量,同时你希望限流算法简单易实现,可以使用滑动时间窗口算法。

如果你的系统经常有突增流量,为了系统整体稳定性,应使用令牌桶算法。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 漏斗算法
    • 固定窗口算法
    • 滑动窗口算法
    • 令牌桶算法
    • 总结
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档