详情

惊落一身雪 Lv.8

关注
这是小卷对分布式体系架构学习的第5篇文章,本日来学习限流器和限流计划模式
1.为什么要限流?

任何一个体系的运算、存储、网络资源都不是无穷的,当体系资源不敷以支持外部凌驾预期的突发流量时,就应该要有弃取,创建面临超额流量自我掩护的机制,而这个机制就是微服务中常说的“限流”
2.四种限流计划模式

说到限流,各人直接的想法就是Sentinel,但是Sentinel限流的原理大概许多人没去深入明确,大概限流到底是怎么做的?详细怎样举行限流,业界内也有一些常见计划模式。
2.1流量计数器模式

流量计数器是一种最简单的限流方式,通过纪录固定时间窗口内的哀求次数来判定是否到达限流阈值。如果哀求次数凌驾限定值,则拒绝后续哀求。
实现方式:

  • 将时间分别为固定的时间窗口(如 1 秒、1 分钟)。
  • 每个窗口维护一个计数器,纪录当前时间窗口内的哀求次数。
  • 如果计数器值凌驾限流阈值,直接拒绝哀求;否则增长计数器。
固定窗口界限标题:

  • 在窗口界限的两头,大概存在短时间内超量哀求的“临界标题
好比场景设定:一秒内的TPS大于80时,就限流。
存在标题:纵然每一秒的统计流量都没有凌驾 80 TPS,也不能分析体系没有遇到过大于 80 TPS 的流量压力。好比说体系在连续2秒内都收到60TPS的哀求,但是哀求发生的时间分别在第1秒的后0.5秒,以及第2秒的前0.5秒。如许体系实际曾在1秒内发生凌驾80 TPS的哀求。

  • 纵然连续多少秒统计流量凌驾阈值,也不能分析流量压力肯定凌驾体系蒙受本领
假设 10 秒的时间片断中,前 3 秒的 TPS 均匀值到了 100,而后 7 秒的均匀值是 30 左右,此时体系是否可以大概处置惩罚完这些哀求而不产生超时失败?答案是可以的
存在缺陷:造成上面2个标题得缘故起因是流量计数器模式是对时间点举行离散的统计
2.2滑动窗口模式

概念:时间轴上,一个固定巨细的窗口随时间平滑滚动。任何时间,静态地通过窗口内观察到的信息,都等价于一段长度与窗口巨细相称的信息。重要是通过纪录多个较小时间窗口(子窗口)的哀求次数,实现更精致化的限流控制
假设:预备观察的时间片断为 10 秒,以 1 秒作为统计精度,那可以得到一个长度为 10 的数组。设定限流阈值是迩来 10 秒内收到的哀求不凌驾 500 个,那么就必要统计10个子数组的哀求总数,是否凌驾阈值。

优点

  • 办理了固定窗口界限标题
缺点

  • 只实用于否决式限流,凌驾阈值的流量就必须失败
2.3漏桶模式

漏桶可以简单的明确:小学水池应用题,一个水池,每秒以 X 升速率注水,同时又以 Y 升速率出水,问水池啥时间装满。
概念:将哀求视为流入漏桶的水,漏桶以固定速率“漏水”。当哀求流量凌驾漏桶的处置惩罚本领时,多余的哀求会被扬弃或列队。其焦点头脑是平滑哀求流量
实现方式

  • 维护一个队列(或计数器),用来模拟漏桶。
  • 新哀求到来时,将哀求放入桶中。
  • 按固定速率处置惩罚桶中的哀求。
  • 如果桶已满,则拒绝新哀求。
缺点:

  • 比力难确定桶的巨细和水流出的速率
2.4令牌桶算法

和漏桶一样是基于缓冲区的限流算法,简单明确就是去银行服务时在列队机号取号的场景。
概念:通过固定速率向桶中添加令牌,哀求到来时必要先斲丧令牌才华被处置惩罚。如果桶中没有富足的令牌,哀求会被拒绝。与漏桶算法差异,令牌桶答应肯定的突发流量
实现方式


  • 维护一个桶,桶中存储令牌。
  • 按固定速率(好比限流是1秒100次哀求,那么隔断10ms时间放入令牌)向桶中添加令牌,直到桶满为止。
  • 哀求到来时从桶中取出令牌,如果没有令牌就立刻失败大概进入降级逻辑。
实际开发的时间,不必要专门做放令牌到桶里这件事,只必要在获取令牌前,比力一下时间戳与当前时间,就能算出必要放入多少令牌,下面是示例代码
  1. private long lastTime = System.currentTimeMillis();
  2. private int tokens = 0; // 当前令牌数
  3. private static final int LIMIT = 100; // 桶容量
  4. private static final int REFILL_RATE = 10; // 令牌添加速率(令牌/秒)
  5. public synchronized boolean tryAcquire() {
  6.     long now = System.currentTimeMillis();
  7.     // 添加令牌
  8.     tokens = Math.min(LIMIT, tokens + (int) ((now - lastTime) / 1000) * REFILL_RATE);
  9.     lastTime = now;
  10.     if (tokens > 0) {
  11.         tokens--;
  12.         return true;
  13.     }
  14.     return false;
  15. }
3.分布式限流

上面先容的4种限流算法都只实用于单机限流,大概把体系当做团体来限流。实际应用中仍旧必要精致的每个服务的限流。
概念:过将限流逻辑分散到多个节点,同时利用同等性算法包管全范围流的同等性。它联合了本地限流和会集式限流的优点。
实现方式

  • 基于 Redis + Lua 脚本

    • 利用 Redis 脚本实现分布式限流,在 Redis 中存储全局的哀求计数器

  • 基于同等性算法

    • 利用分布式同等性算法(如 Raft、Paxos)维护全局流量状态

  • 分布式网关

    • 通过 API 网关(如 Kong、Nginx、Spring Cloud Gateway)实现流量的同一调理和限流。

缺点

  • 实现复杂度高,且网络通讯和同等性利用带来额外延长。当流量大时,限流自己会低落体系处置惩罚本领
总结

本日学习了4种限流计划模式:流量计数器模式、滑动窗口模式、漏桶模式、令牌桶模式,背面2种都是基于缓冲区的限流算法。简单相识了下分布式限流的概念。限流自己是有代价的,实际开发中必要衡量方案的代价和收益。后续偶然间增补Sentinel的限流原理和此中用了哪些计划模式。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
附件: 您需要登录才可以下载或查看附件。没有账号?立即注册
101阅读
0回复

暂无评论,点我抢沙发吧