欢迎光临散文网 会员登陆 & 注册

限流 – 限流注解组件开发

2022-11-05 22:19 作者:限量版范儿  | 我要投稿

限流概述

系统存在服务上限,流量超过服务上限会导致系统卡死、崩溃。
限流:为了在高并发时系统稳定可用,牺牲或延迟部分请求流量以保证系统整体服务可用。

限流算法

  • 固定窗口计数

    • 将时间划分为多个窗口;

    • 在每个窗口内每有一次请求就将计数器加一;

    • 如果计数器超过了限制数量,则本窗口内所有的请求都被丢弃当时间到达下一个窗口时,计数器重置。

  • 滑动窗口计数

    • 将时间划分为多个区间;

    • 在每个区间内每有一次请求就将计数器加一维持一个时间窗口,占据多个区间;

    • 每经过一个区间的时间,则抛弃最老的一个区间,并纳入最新的一个区间;

    • 如果当前窗口内区间的请求计数总和超过了限制数量,则本窗口内所有的请求都被丢弃。

  • 漏桶

    • 将每个请求视作"水滴"放入"漏桶"进行存储;

    • "漏桶"以固定速率向外"漏"出请求来执行如果"漏桶"空了则停止"漏水";

    • 如果"漏桶"满了则多余的"水滴"会被直接丢弃。

  • 令牌桶

    • 令牌以固定速率生成;

    • 生成的令牌放入令牌桶中存放,如果令牌桶满了则多余的令牌会直接丢弃,当请求到达时,会尝试从令牌桶中取令牌,取到了令牌的请求可以执行;

    • 如果桶空了,那么尝试取令牌的请求会被直接丢弃。

漏桶和令牌桶对比

  • 两者实际上是相同的

    • 在实现上是相同的基本算法,描述不同。

    • 给定等效参数的情况下,这两种算法会将完全相同的数据包视为符合或不符合。

    • 两者实现的属性和性能差异完全是由于实现的差异造成的,即它们不是源于底层算法的差异。

  • 漏桶算法在用作计量时,可以允许具有抖动或突发性的一致输出数据包流,可用于流量管制和整形,并且可以用于可变长度数据包。

  • 参考:

    • 漏桶 - wikipedia

    • 令牌桶 - wikipedia

相关阅读:

  • 分布式服务限流实战,已经为你排好坑了

  • 接口限流算法总结 - 穿林度水

限流注解组件实现

  1. 利用 Spring 拦截器实现

  2. 使用方式:Controller 方法或类加上限流注解,请求到达拦截器时进行拦截处理

  3. 使用 Redis 记录数据,Lua 保证多个命令原子性执行。

  • 使用示例

    @RestController @RequestMapping("/ratelimit/custom") @RateLimit(threshold = 10, rateLimiter = RateLimiterEnum.FIXED_WINDOW, time = 10, timeUnit = TimeUnit.SECONDS) public class RateLimitController {    @GetMapping("/fixed/window")    @RateLimit(threshold = 10, rateLimiter = RateLimiterEnum.FIXED_WINDOW, time = 10, timeUnit = TimeUnit.SECONDS)    public ResponseResult<String> fixedWindow(Long id) {        id += RandomUtil.randomLong();        log.info("custom:fixedWindow:{}", id);        return ResponseResult.success("custom:fixedWindow:" + id);    } }
  • 限流注解 RateLimit.java

    • 支持不同类型缓存 key: key() + keyType()

    • 支持使用不同限流算法: rateLimiter()

    • 限流流量阈值设置: threshold()

    • 限流时长设置: time() + timeUnit()

  • 限流拦截器处理 RateLimitInterceptor.java

  • 限流算法 lua 脚本

    固定窗口: fixed_window_rate_limiter.lua

    滑动窗口: sliding_window_rate_limiter.lua

    漏桶: leaky_bucket_rate_limiter.lua

    令牌桶: token_bucket_rate_limiter.lua

其他

demo 地址:https://github.com/EastX/java-practice-demos/tree/main/demo-ratelimit

推荐阅读:

  • 限流 - JavaGuide

  • 架构之高并发:限流 - pdai

作者:EastX

原文链接:https://www.dianjilingqu.com/602395.html

限流 – 限流注解组件开发的评论 (共 条)

分享到微博请遵守国家法律