高并发系统设计 40 问
唐扬
美图公司技术专家
49013 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 49 讲
高并发系统设计 40 问
15
15
1.0x
00:00/00:00
登录|注册

35 | 流量控制:高并发系统中我们如何操纵流量?

实际项目应用经验分享
压力测试
阈值动态调整
令牌桶算法
漏桶算法
滑动窗口算法
固定窗口算法
多维度控制
作用
定义
思考
实际应用
限流算法
限流
流量控制:高并发系统中我们如何操纵流量?

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

你好,我是唐扬。
上一节课里,我带你了解了微服务架构中常见的两种有损的服务保护策略:熔断和降级。它们都是通过暂时关闭某些非核心服务或者组件从而保护核心系统的可用性。但是,并不是所有的场景下都可以使用熔断降级的策略,比如,电商系统在双十一、618 大促的场景。
这种场景下,系统的峰值流量会超过了预估的峰值,对于核心服务也产生了比较大的影响,而你总不能把核心服务整体降级吧?那么在这个时候要如何保证服务的稳定性呢?你认为可以使用限流的方案。而提到限流,我相信你多多少少在以下几个地方出错过:
限流算法选择不当,导致限流效果不好;
开启了限流却发现整体性能有损耗;
只实现了单机的限流却没有实现整体系统的限流。
说白了,你之所以出现这些问题还是对限流的算法以及实际应用不熟练,而本节课,我将带你了解这些内容,希望你能将这些经验应用到实际项目中,从而提升整体系统的鲁棒性。

究竟什么是限流

限流指的是通过限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则只能通过拒绝服务的方式保证整体系统的可用性。限流策略一般部署在服务的入口层,比如 API 网关中,这样可以对系统整体流量做塑形。而在微服务架构中,你也可以在 RPC 客户端中引入限流的策略,来保证单个服务不会被过大的流量压垮。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

在高并发系统中,流量控制是至关重要的。本文介绍了微服务架构中常见的限流策略,以及限流算法的选择和实际应用。限流通过限制系统的并发请求数量,保证系统能够正常响应部分用户请求,对于超过限制的流量,则只能通过拒绝服务的方式保证整体系统的可用性。文章介绍了固定窗口和滑动窗口算法,并指出了它们的优缺点。此外,还提到了漏桶算法和令牌桶算法,这些算法在实际项目中更为常用。通过本文的总结,读者可以快速了解流量控制的重要性以及不同的限流算法,为实际项目中的流量控制提供了有益的参考。 漏桶算法的原理是在流量产生端和接收端之间增加一个漏桶,流量会进入和暂存到漏桶里面,而漏桶的出口处会按照一个固定的速率将流量漏出到接收端。如果流入的流量在某一段时间内大增,超过了漏桶的承受极限,多余的流量就会触发限流策略,被拒绝服务。漏桶算法能够让流量变得更平滑,类似于消息队列削峰填谷的作用。 另一种令牌桶算法的基本算法是每隔一定时间往桶内放入一个令牌,请求需要从桶中获得一个令牌,如果桶中已经没有了令牌,就需要等待新的令牌或者直接拒绝服务。令牌桶算法可以应对一定的突发流量,因此在实际项目中应用更多。 限流策略是微服务治理中的标配策略,能在多个维度进行流量的控制。在实际项目中,可以将阈值放置在配置中心中方便动态调整,并通过定期的压力测试得到实际承载能力,再设置合适的阈值。 通过本文的总结,读者可以快速了解流量控制的重要性以及不同的限流算法,为实际项目中的流量控制提供了有益的参考。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《高并发系统设计 40 问》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(31)

  • 最新
  • 精选
  • 台风骆骆
    听老师的课,每次都有收获,给老师点个赞。 限流方式有如下: 1、固定窗口 2、滑动窗口 3、漏斗,一般用队列来实现,但是会造成请求有延迟并且也对处理突发流量不友好。 4、令牌桶,通过往桶内定时放入一个令牌,请求过来时先要申请到令牌才能继续,否则请求失败,这个对于处理突发流量时比较友好,即平时可以攒,到突发流量时可以直接用起来,guava的ratelimiter就是令牌桶算法实现的,分布式令牌桶可以用redis来实现,可以一次申请多个而不是一个这样可以降低每次请求的开销。

    作者回复: 赞总结,谢谢~

    2019-12-13
    13
  • 阿土
    令牌桶以及漏桶算法的分布式实现有可以参考的么?

    作者回复: guava 的RateLimit

    2019-12-13
    3
    10
  • 👽
    自我感觉,流浪控制跟消息队列的原理类似。 都是把突发请求,采用类似于分片的方式,分批处理。降低响应速度,但是却都能响应,不会导致宕机。 令牌桶的思路,也偏向于地铁限流的策略:每隔一定的时间,放进来一定数量的乘客,虽然每个乘客的平均等待时间更长了,但是却防治了地铁被挤爆,发生危险。 另外老师,我想说另一个问题是,地铁的限流,我觉得不单单是防止地铁站被挤爆。我觉得主要是考虑后面站点的乘客问题。 假设:地铁有站点 1 2 3 一辆地铁能容纳1000人,地铁五分钟一趟,站点1每5分钟有客流量1000人。考虑地铁的承载能力,就算第一站全部放进来也可以,但是由于地铁乘客大概率都会乘坐2站以上,就会导致第2,3站点有大量乘客长时间等待。所以,地铁站限流也是为了给后面的站点留出一定的运载额。

    作者回复: 是的,理解深刻~

    2020-02-12
    3
    6
  • ちよくん
    批量获取令牌后怎么处理呢?放到服务的本地缓存中吗?还是另起一个新的redis 缓存?如果新开一个redis 缓存,和直接取区别不大吧?如果本地的内存缓存,也不见得比直接从redis 取快多少吧,可能会快一丢丢,毕竟所有的请求都直接从redis 取,压力会比较大,相当于把redis中的数据打散到各个服务再处理

    作者回复: 放在本地内存里面

    2020-01-27
    6
  • 大鸡腿🍗
    看到评论说业界,没有成熟的方案,这里就要捶你了。开发:rateLimit,semaphore,框架:阿里的sentiel以及它的各种限流产品

    作者回复: 文章中也提到有guava的RateLimit

    2019-12-15
    6
  • leslie
    这周刚开始学习老师的课程,算法训练营刚基本结束,就继续开始知识的强化,下周老师基本上能赶上进度,学习中可能会在后续的提出一些前面课程的困惑希望老师不吝赐教。 限流的用户体验太差了:令牌桶算法和漏桶算法确实不错,有生产环境用限流不过体验非常差,每年次数不多且.net系的似乎没用好的策略,故而都是暴力的增加带宽去解决。 老师在课程小结前面的"我们可以在每次取令牌的时候,不再只获取一个令牌,而是获取一批令牌,这样可以尽量减少请求 Redis 的次数。"这个其实稍有问题,个人觉得改成"我们可以在每次取令牌的时候,不再只获取一个令牌,而是通过MQ获取一批令牌,这样可以尽量减少请求 Redis 的次数。"更为符合生成环境的操作。 数据系统/中间件存储已经不再是当初的CS或BS开发架构:高并发分布式架构其实就是要充分利用这些组件,带来的问题就是运维复杂。不过我记得陈皓老师说过"运维优先,做平台的思路就是一定要能维护好",这其实是许多中小企业不重视的方面且觉得无所谓的方面,从而导致了大量设计思路的错误,造成了大量的不必要的高并发。有时加个组件就能完成-前提是你对它足够了解。 今年在中小电商平台经历过其多套系统,典型的问题还是系统的合理性已经维护的问题带来了大量的高并发,数据系统中的某些组件性能优化做到后相比过去有了极其显著的提升,让慢查询比例缩短至过去10-15%,可是依然在某些峰之上还是有问题。流量控制其实涉及到的不是数据库而是数据系统和整体系统的性能维护,这是我觉得很多技术负责人没有看到的问题。 期待老师后续的分享:后续的课程中会有一些前面的问题,还望老师不吝赐教-谢谢。

    作者回复: 加油~

    2019-12-13
    3
    4
  • 安排
    限流一般在rpc调用端做吗?还是被调用端?

    作者回复: 在调用端做的多,服务端也会做

    2020-03-27
    2
    3
  • Lee
    令牌桶算法中令牌是否有过期的概率?例如每秒钟限制是100,则每10ms放入一个令牌,如果令牌桶中令牌的最大值是1000。在某一端时间内一直没有流量,令牌桶中令牌到达了最大值,之后的1s内来了1000次请求,那都能获取到令牌。这样岂不是不能起到限流的作用?

    作者回复: 一般不需要过期。你这种场景下,只在短时间之内会有大量请求

    2020-02-27
    13
    3
  • 斐波那契
    这两个方法也是阿里在用的方法 阿里有一本书叫决战双11中提到的限流 就是这两个方法

    作者回复: 是通用的做法

    2019-12-13
    2
  • 阿土
    前不久做了一个一句话需求:同一个用户每5秒只能提交一次订单,每天只能提交最多200次订单。采用的方式就是固定窗口请求计数的粗爆算法,简单快捷。最终每天的请求量汇总用来做数据分析。我在考虑是不是可以用令牌桶算法来实现地更优雅一些呢?

    作者回复: 可以的,固定窗口应该会有所说的边界问题

    2019-12-13
    3
    2
收起评论
显示
设置
留言
31
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部