15 | 限流器设计:如何避免超预期的高并发压力压垮系统?
该思维导图由 AI 生成,仅供参考
需求分析
- 深入了解
- 翻译
- 解释
- 总结
本文介绍了在互联网高可用架构设计中,如何通过限流器来避免超预期的高并发压力压垮系统。限流器是一种经典的高可用架构模式,用于在系统面临突发高并发访问或恶意攻击时,拒绝部分访问请求以降低系统负载压力,确保系统依然可用。文章提出了一个名为“Diana”的限流器的需求分析和设计概要,包括限流规则的配置、部署模型、限流模式设计、高可用设计和详细设计。其中,限流器支持全局限流、账号限流、设备限流和资源限流等多种限流方式,并且设计遵循开闭原则,支持灵活的限流规则功能扩展。文章还详细讨论了四种常用的限流算法的实现,以及限流器的配置文件设计。通过本文,读者可以了解到限流器的设计原则、部署模型和限流算法的选择,对于系统高可用架构设计具有一定的参考意义。文章还提出了滑动窗口、漏桶和令牌桶等不同的限流算法,分析了它们的实现原理和适用场景,为读者提供了丰富的技术选型参考。同时,文章强调了架构师需要兼具宏观技术决策和微观核心代码实现的能力,以确保技术中间件的易用性和扩展性。整体而言,本文为读者提供了深入了解高可用架构设计和限流算法实现的宝贵资料。
《李智慧 · 高并发架构实战课》,新⼈⾸单¥59
全部留言(20)
- 最新
- 精选
- javaadu(1)使用队列管理时间片,每次窗口移动就是一个出队和入队操作 (2)使用hashmap管理各个时间片的计数器key,如果是本地模式则value存在内存中,如果是分布式模式则value存放在redis中
作者回复: 非常赞
2022-03-269 - 易企秀-郭彦超个人觉得可以使用redis的的hash 通过 对时间进行取模分片
作者回复: 很赞
2022-03-247 - 周文童Sentinel 是用 Atomic 的 Array 存储,每个数组元素为一个 bucket,存储的时候用时间戳和数组的 length 取模。算累计时间就只需要遍历数组,算每一个 bucket 里面的时间戳和当前时间戳是否在一个时间限制里面。
作者回复: 很赞。相当于用时间戳计算Hash值,key就是时间片,所以其实不用遍历数组,取模就得到数组下标。
2022-03-234 - 食指可爱多我之前做过一个分布式限流组建,就是用令牌桶算法。redis做存储,脚本逻辑用lua脚本实现,算法逻辑参考Google Guava中的实现。
作者回复: 赞
2022-04-061 - JavRedis单机10w啊,用redis作为限流器有瓶颈,有没有方案可以解决这个性能瓶颈的?
作者回复: 全局限流通常是需要进行小流量、精确限流的场景,比如秒杀商品,控制访问量不要超过商品数量太多,这类场景的rpu通常不会很大。10万级rpu的限流建议就不要全局限流了,意义不大。
2022-09-21归属地:北京 - Logan关于分布式限流,如果每个请求过来,都和Redis进行交互,岂不是会影响接口耗时? 目前项目中和Redis交互的耗时大约需要5~10ms
作者回复: 是的,会影响性能,所以全局限流器应该应用在需要精确控制访问量的接口上,这种接口的并发量通常不会太高。 redis的正常耗时应该在1~2ms,你的项目中耗时似乎有点偏高了。
2022-05-15 - gesanri这个漏桶算法的伪代码,看意思是假设1秒限制10个请求,假设第一个请求在2ms的时候来了并且当时就处理完了,完后第二个请求在5ms的时候来了,那么第二个请求也必须等到102ms的时候才能被处理,是这样吗?
作者回复: 是的
2022-05-03 - 开心小毛想请教李老师一个选用限流策略的问题:如果不追求严格的每秒请求上限,到底存不存在一种应用场景是只能用漏桶而不能用令牌桶的呢?如果不追求严格的每秒请求上限,存不存在一种应用场景漏桶策略会优于令牌桶?
作者回复: 漏桶和令牌桶在是否严格控制每秒请求上限上没区别啊,区别就是在于适用场景不同,比如一个计算密集型的应用在一个单CPU计算机上运行,每个请求需要运算10ms,那么显然设置rpu为100的漏桶比令牌桶更好。
2022-04-252 - Tico漏桶算法可以用于同步网关的场景,重点是不要把请求放到队列里面去消费,比如说设置一个50深度的队列,请求来我往队列里放一个对象(这个对象不是请求信息),若能放进队列说明队列未满可以继续执行请求,应用返回处理结果的时候去消费一个队列数据,若放不进去说明队列满了直接返回503
作者回复: 开始队列为空的时候,如果同时来50个请求,都能放进队列,那就同时去执行?这不是漏桶,这是令牌桶。。。
2022-04-132 - dao固定窗口是滑动窗口的一个特例。滑动窗口算法: 1)在同一时间片内累加计数; 2)在同一时间窗口内,切换时间片时计数会移交下一时间片; 3)窗口切换时,重置时间片序号和计算器。 固定窗口没有2),并且1)是指同一时间窗口,3)没有时间片序号重置。 个人看法,对于同一限流计数器,不需要特殊的数据结构,使用一般对象就可以。对象可能包含的信息如下, { 时间片序号,截止时间戳,计数 } (附:这个对象是复用的,在计数、时间片切换、窗口切换时更新) 多种限流计数器之间使用 hashmap 。
作者回复: 赞
2022-04-02