1. 时间窗介绍

在之前的学习中,我们已经学习完成了Sentinel源码的Node关系、责任链调用,那么这节课我们就要学习Sentinel核心源码中的一个非常重要的算法“滑动时间窗口算法”,也就是结构图中的WindowLeapArray,它为Sentinel提供当前时间的数据支撑, 如当前QPS,请求数,异常数等。

2. 固定时间窗口算法

要学习滑动窗口,我们先要学习时间窗口算法,以循序渐进的方式了解滑动窗口,时间窗口算法也可以称之为:固定时间窗算法

概念:固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入。超过数量就拒绝或者排队,等下一个时间段进入。

那我们来看图分析:

具体分析一下:

  1. 将当前的时间分为10t大小的几个时间窗
  2. 规则是阈值为100个请求数,每个时间窗里面的请求数量不能超过阈值100
  3. 10t到16t进入请求10个,16t到20t进入请求50个,总数60个请求,没有超过阈值100
  4. 20t到26t进入请求60个,26t到30t进入请求20个,总数80个请求,没有超过阈值100
  5. 30t到40t之间进入请求120个,超过阈值20个,所以20个请求无法进入

存在问题:

16t到26t之间也是10t大小的一个时间窗,但跨了两个固定的时间窗,问题是请求总数为110,超过阈值,这种固定时间窗无法处理这部分超出的请求,所以解决办法就是使用滑动时间窗

3. 滑动时间窗算法

使用滑动时间窗的主要原因是虽然以上提到超出阈值的范围跨了两个时间窗,但是超过的请求书的范围是10t,且实际上我们要清楚,我们系统限流的目的是要在任意时间窗都要能应对突然的流量暴增,如果使用以上的算法,就会造成在16t和26t之间的请求无法限流,严重会导致服务雪崩。

要解决的话,我们就需要使用滑动时间窗算法,具体原理如下:

滑动时间窗限流算法解决了固定时间窗限流算法的问题。其没有划分固定的时间窗起点与终点,而是将每一次请求的到来时间点作为统计时间窗的终点,起点则是终点向前推时间窗长度的时间点。这种时间窗称为“滑动时间窗”

看图分析

此图中我们可以分析中,实际上当前的时间窗不再是固定的,而是可以从时间的起始位置一直向右滑动

这样的话就可以解决固定时间窗带来的问题,其原理就是:

  1. 当前时间窗口为滑动窗口,可以从左向右按照时间顺序进行滑动,并且大小为10t,同时此时的阈值为100
  2. 红色线的位置进入一个请求,此时想要判断这个请求是否能够正常通过,就要看当前滑动窗口中的请求数量是否达到阈值,如果当前没有达到阈值100,就可以正常通过,但是如果一旦超过阈值,就会被进行限流。

存在问题

但是此时滑动时间窗还是有问题的,问题就是会出现大量的重复统计,造成系统效率下降,如下图所示:

在此图中我们就可以看出,这个蓝色的区域就是重复统计的区域,也就是说每一次移动时间窗口,都需要重新统计重复区域的请求数量,从而导致浪费大量的系统资源。

解决办法

想要解决以上的问题,我们就需要更加细粒度话的计算,增加多个子时间窗口:样本窗口

4. 优化滑动时间窗算法-样本窗口

为了解决滑动时间窗算法因为每次滑动都需要重复统计滑动前的一部分数据的问题,这个问题很致命,特别是作为一个流控组件来说,不应该影响整体系统的效率。所以需要改进, 在改进方案中,引入了样本窗口来解决问题。

样本窗口概念:

  1. 样本窗口的长度必须小于滑动窗口长度,如果等于滑动窗口长度就会退化成固定时间窗口
  2. 一般滑动窗口长度是样本窗口的整数倍,比如:4*样本窗口=1个滑动窗口
  3. 每个样本窗口在到达终点时间时,会统计本样本窗口中的流量数据并且记录下来。
  4. 当一个请求达到时,会统计当前请求时间点所在的样本窗口中的流量数据,然后在获取当前请求时间的样本窗口以外的同一个滑动窗口中的样本窗口的统计数据,进行求和,如果没有超出阈值,则通过,否则就会被限流

原理图被限流的情况:

此时会被流控,因为因为样本窗口的请求数加起来再加上当前时间窗的10个请求数已经到阈值100了,所以新过来的请求就会被流控

原理图不被限流的情况:

此时这个请求将不会被限流,因为本次请求的时间的对应的样本窗口只有5个请求加上之前重复的样本窗口统计的流量值,没有超过阈值100,所以本次请求会通过。

13. 滑动时间窗口算法概念原理相关推荐

  1. sentinel滑动时间窗口算法学习

    滑动时间窗口 先不说sentinel的算法实现,先说什么是滑动时间窗口, 我们在进行限流的时候,比如通过QPS进行限流,那假如我们以秒为单位,举个例子: 我设置了限流规则,qps是10 如果不使用滑动 ...

  2. sentinel 滑动时间窗口算法

    sentinel 滑动时间窗口的算法 为什么要用滑动时间窗口算法? 互联网中最常见的一个问题:限流,即在一段时间内,限制访问某个接口的请求数. 要实现限流(或熔断降级),方法有很多,最基本的如计数器法 ...

  3. 精度不够,滑动时间来凑「限流算法第二把法器:滑动时间窗口算法」- 第301篇

    相关历史文章(阅读本文之前,您可能需要先看下之前的系列

  4. Java 实现滑动时间窗口限流算法,你见过吗?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | dijia478 来源 | https://w ...

  5. JAVA实现滑动时间窗口

    先上代码 package demo;import java.time.LocalTime; import java.util.LinkedList; import java.util.List; im ...

  6. Redis(六)——限流算法:滑动时间窗口限流和漏斗限流

    本文主要总结自<redis深度历险> 限流的意义 限流一般是指在一个时间窗口内对某些操作请求的数量进行限制,比如一个论坛限制用户每秒钟只能发一个帖子,每秒钟只能回复5个帖子.限流可以保证系 ...

  7. 【限流算法】java实现固定时间窗口算法

    本文实现了一种基于java的固定时间窗口计数器算法 固定时间窗口计数器算法思想:在固定的时间窗口内,可以允许固定数量的请求进入.超过数量就拒绝或者排队,等下一个时间段进入. 优点:和令牌桶相比,这种算 ...

  8. 时间窗口算法用matlab,一种基于动态规划算法的时间窗口相关的参与者选择方法与流程...

    本发明涉及一种移动群智感知中时间窗口相关的参与者选择方法,特别地,涉及一种基于动态规划算法的时间窗口相关的参与者选择方法. 背景技术: 在移动群智感知网络中,智能设备中嵌入了麦克风.相机.温度传感器. ...

  9. storm滑动时间窗口实现

    storm是一个流式处理框架,可以做到Spout产生一条数据,Bolt处理一条以达到实时计算. 这种模式并不是实际的业务需要的,我们更多是需要 最近5分钟的PV  UV ,最近10分钟的网络最大延迟, ...

  10. 时间轮算法概念;netty时间轮使用

    概述 在一些中间件中我们经常见到时间轮控制并发和熔断. 那么这个时间轮具体是什么呢,又是怎么使用的呢. 简介 其实时间轮可以简单的理解成我们日常生活中的时钟. 时钟里的指针一直在不停的转动,利用这个我 ...

最新文章

  1. OpenCV中对图像数据进行64F和8U转换的方法
  2. 基于hexo搭建个人免费博客——基本设置和了解
  3. 某电力企业数据备份方案解析
  4. linux重启memcache_Linux下的Memcache安装方法
  5. STA 137 Topics covered this week
  6. MySQL分页查询方法及优化
  7. mac如何安装python_手把手教你安装Python开发环境(二)之Mac电脑安装Python解释器...
  8. DXUT框架剖析(5)
  9. C语言:编写一个函数,计算二维数组中的最大元素,数组以指针的方式传递
  10. 网站前端_KindEditor.基础入门.0002.KindEditor_3.4.2配置参数?
  11. 曲线任意里程中边桩坐标正反算(CASIO fx-4800P计算器)程序
  12. Gradle下载安装 使用本地Maven仓库 IDEA2020.1配置Gradle
  13. 组建局域网_局域网组建常用的网线种类解读
  14. app自动化之monkey测试
  15. 一阶线性微分方程计算公式推导
  16. 使用redis所维护的代理池抓取微信文章
  17. Postman----打开postman console控制台,查看接口测试打印log
  18. 遭遇腾讯SOSO爬虫攻击
  19. 【Python虚拟环境】Windows环境下Python虚拟环境的创建与激活
  20. fitbit同步不了怎么解决_怎么处理Fitbit 后台同步错误信息?

热门文章

  1. java毕业设计鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  2. 菜鸟也疯狂,易语言自绘控件__进度条、滑块条
  3. SpringBoot项目下载resources目录下模板文件
  4. 前端彷英雄联盟官网/个人心得
  5. 罗技 连点 脚本_拳头与罗技G展开合作 将推出《英雄联盟》主题外设--新闻中心...
  6. NetSetMan Pro专业网络设置管理器
  7. Round14—最小生成树
  8. C++ 中typedef用法
  9. 《程序员修炼之道》第2版
  10. 人员基础信息一体化采集系统平台