李智慧 · 高并发架构实战课
李智慧
同程艺龙交通首席架构师,前 Intel & 阿里架构师,《大型网站技术架构》作者
23286 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 26 讲
李智慧 · 高并发架构实战课
15
15
1.0x
00:00/00:00
登录|注册

15 | 限流器设计:如何避免超预期的高并发压力压垮系统?

规则包括:Url, actor, unit, rpu, algo, scope
YAML格式
令牌桶(Token Bucket)
漏桶(Leaky Bucket)
滑动窗口(Sliding Window)
固定窗口(Window)
Redis不可用 -> 本地限流
配置中心不可用 -> 本地配置
远程配置
本地配置
用户请求 -> 负载均衡 -> 网关服务器 -> 过滤器责任链 -> 限流器
资源限流
设备限流
账号限流
全局限流
滑动窗口算法的时间片管理和计数器之和计算
技术中间件要经得起同行审视
易用性和扩展性
综合效果好,推荐使用
请求需要令牌才能处理
特定速度放入令牌
可能导致资源浪费
阻塞等待实现
控制请求处理速度
避免固定窗口的瞬时流量问题
时间窗口内部切分小时间片
可能导致瞬时流量过高
时间窗口内限制流量
配置文件设计
限流算法
自动降级功能
使用Redis作为远程服务器
本地限流 vs 远程限流
限流策略
部署模型
开闭原则:支持扩展新配置规则
限流方式
支持本地和远程配置
过滤器方式过滤请求
微服务网关或HTTP服务器入口部署
Diana
限流:拒绝部分请求以保护系统
避免系统因高并发崩溃
思考题
小结
令牌桶限流算法
漏桶限流算法
滑动窗口限流算法
固定窗口限流算法
详细设计
高可用设计
限流模式设计
概要设计
需求分析
产品名称
高可用架构模式
限流器设计

该思维导图由 AI 生成,仅供参考

你好,我是李智慧。
在互联网高可用架构设计中,限流是一种经典的高可用架构模式。因为某些原因,大量用户突然访问我们的系统时,或者有黑客恶意用 DoS(Denial of Service,拒绝服务)方式攻击我们的系统时,这种未曾预期的高并发访问对系统产生的负载压力可能会导致系统崩溃。
解决这种问题的一个主要手段就是限流,即拒绝部分访问请求,使访问负载压力降低到一个系统可以承受的程度。这样虽然有部分用户访问失败,但是整个系统依然是可用的,依然能对外提供服务,而不是因为负载压力太大而崩溃,导致所有用户都不能访问。
为此,我们准备开发一个限流器,产品名称为“Diana”。

需求分析

我们将 Diana 定位为一个限流器组件,即 Diana 的主要应用场景是部署在微服务网关或者其他 HTTP 服务器入口,以过滤器的方式对请求进行过滤,对超过限流规则的请求返回“服务不可用”HTTP 响应。
Diana 的限流规则可通过配置文件获取,并需要支持本地配置和远程配置两种方式,远程配置优先于本地配置。限流方式包括:
全局限流:针对所有请求进行限流,即保证整个系统处理的请求总数满足限流配置。
账号限流:针对账号进行限流,即对单个账号发送的请求进行限流。
设备限流:针对设备进行限流,即对单个客户端设备发送的请求进行限流。
资源限流:针对某个资源(即某个 URL)进行限流,即保证访问该资源的请求总数满足限流配置。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文介绍了在互联网高可用架构设计中,如何通过限流器来避免超预期的高并发压力压垮系统。限流器是一种经典的高可用架构模式,用于在系统面临突发高并发访问或恶意攻击时,拒绝部分访问请求以降低系统负载压力,确保系统依然可用。文章提出了一个名为“Diana”的限流器的需求分析和设计概要,包括限流规则的配置、部署模型、限流模式设计、高可用设计和详细设计。其中,限流器支持全局限流、账号限流、设备限流和资源限流等多种限流方式,并且设计遵循开闭原则,支持灵活的限流规则功能扩展。文章还详细讨论了四种常用的限流算法的实现,以及限流器的配置文件设计。通过本文,读者可以了解到限流器的设计原则、部署模型和限流算法的选择,对于系统高可用架构设计具有一定的参考意义。文章还提出了滑动窗口、漏桶和令牌桶等不同的限流算法,分析了它们的实现原理和适用场景,为读者提供了丰富的技术选型参考。同时,文章强调了架构师需要兼具宏观技术决策和微观核心代码实现的能力,以确保技术中间件的易用性和扩展性。整体而言,本文为读者提供了深入了解高可用架构设计和限流算法实现的宝贵资料。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《李智慧 · 高并发架构实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(20)

  • 最新
  • 精选
  • javaadu
    (1)使用队列管理时间片,每次窗口移动就是一个出队和入队操作 (2)使用hashmap管理各个时间片的计数器key,如果是本地模式则value存在内存中,如果是分布式模式则value存放在redis中

    作者回复: 非常赞

    2022-03-26
    9
  • 易企秀-郭彦超
    个人觉得可以使用redis的的hash 通过 对时间进行取模分片

    作者回复: 很赞

    2022-03-24
    7
  • 周文童
    Sentinel 是用 Atomic 的 Array 存储,每个数组元素为一个 bucket,存储的时候用时间戳和数组的 length 取模。算累计时间就只需要遍历数组,算每一个 bucket 里面的时间戳和当前时间戳是否在一个时间限制里面。

    作者回复: 很赞。相当于用时间戳计算Hash值,key就是时间片,所以其实不用遍历数组,取模就得到数组下标。

    2022-03-23
    4
  • 食指可爱多
    我之前做过一个分布式限流组建,就是用令牌桶算法。redis做存储,脚本逻辑用lua脚本实现,算法逻辑参考Google Guava中的实现。

    作者回复: 赞

    2022-04-06
    1
  • Jav
    Redis单机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-25
    2
  • Tico
    漏桶算法可以用于同步网关的场景,重点是不要把请求放到队列里面去消费,比如说设置一个50深度的队列,请求来我往队列里放一个对象(这个对象不是请求信息),若能放进队列说明队列未满可以继续执行请求,应用返回处理结果的时候去消费一个队列数据,若放不进去说明队列满了直接返回503

    作者回复: 开始队列为空的时候,如果同时来50个请求,都能放进队列,那就同时去执行?这不是漏桶,这是令牌桶。。。

    2022-04-13
    2
  • dao
    固定窗口是滑动窗口的一个特例。滑动窗口算法: 1)在同一时间片内累加计数; 2)在同一时间窗口内,切换时间片时计数会移交下一时间片; 3)窗口切换时,重置时间片序号和计算器。 固定窗口没有2),并且1)是指同一时间窗口,3)没有时间片序号重置。 个人看法,对于同一限流计数器,不需要特殊的数据结构,使用一般对象就可以。对象可能包含的信息如下, { 时间片序号,截止时间戳,计数 } (附:这个对象是复用的,在计数、时间片切换、窗口切换时更新) 多种限流计数器之间使用 hashmap 。

    作者回复: 赞

    2022-04-02
收起评论
显示
设置
留言
20
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部