浅浅的聊一下时间窗口及其应用场景

2023-12-05

一. 前言

时间窗口在限流 ,分布式 ID 的生成方面都有很多应用,这一篇主要目的是弄清楚怎么最好的实现这个功能。

时间窗口的应用很多 : 可以用于统计和监控,也可以用于限流和流量控制,或者在指定窗口里面做实时计算,ID 生成等业务处理等

二. 原理

时间窗口其实由 窗口 滑动机制 两个部分组成。窗口只是一个规约的虚拟容器,滑动机制才是整个过程的核心。

  • 窗口 :要把连续的业务切分成多大的窗口
  • 滑动机制 :窗口如何平滑的来到下一个窗口

从这个思路继续往下看,时间窗口可以分为以下几种 :

2.1 翻滚时间窗口

image.png

  • 特点 : 只会处理当前时间窗口的事情,当前处理完成后抛弃当前数据处理以下各时间周期的事情,时间周期是翻滚的形式进行跳动的

例如 : 第一个窗口时 1-5 秒 ,第二个窗口为 6-10 秒

2.2 滑动时间窗口

image.png

  • 特点 : 以滑动的形式递进,上一个时间窗口的部分数据在下一个时间窗口会被统计

例如 : 第一个时间窗口为 1-5 秒, 第二个时间窗口为 2-6 秒

总结 :

这两者对数据处理的形式是不同的,在实现上也会有所不同 :

滚动式的时间窗口通常把数据存放在窗口对象中 , 每一次滚动后直接把之前的窗口对象抛弃即可 , 比较使用时间戳进行大小比较就行。 所以通常实现是:

  • 一个数组管理所有的时间窗口( 时间窗口没有更细粒度
  • 该时间窗口对象记录当前时间窗口的各项信息。

滑动式的时间窗口 就会稍微麻烦一点,他要 先把数据按照更细小的时间段进行统计 然后在更大的时间范围内汇总 (方式一 : 样本式 ),或者把数据以时间为索引进行排序记录(方式二 : 实时统计 )。但是总体来说 , 数据和当前时间窗口是分开的。

  • 一个数组记录数据,每个索引(点位)对应一个极小的时间粒度
  • 一个时间窗口对象记录当前时间窗口的开始时间,通过开始时间和结束时间从数组中统计数据

image.png

所以说,滑动式的时间窗口更加精密,但是实现和算力要求的更高。 在滑动式里面 ,使用样本窗口可以避免反复计算,但是不适用扩展更复杂的窗口形式 ( 会话窗口

三. 一些框架的应用

3.1 Sentinel 怎么实现滑动时间窗口的

Sentinel 实现时间窗口最核心的类为 LeapArray 。 该类会把一段时间内划分出若干个小的时间片 ,然后在这个时间片内进行数据统计。


  

java

复制代码

// S1 : 定义时间窗口对象 WindowWrap public class WindowWrap<T> { // ------当前窗口的时间长度 private final long windowLengthInMs; // ------当前窗口的开始时间 private long windowStart; // ------当前窗口内的数据 private T value; } // S2 : 在 LeapArray 中通过一个数组管理时间窗口 private final ReentrantLock updateLock = new ReentrantLock(); - 该数组在构造器中初始化大小 this.array = new AtomicReferenceArray<>(sampleCount); // S3 : 如何判断当前的时间窗口 public WindowWrap<T> currentWindow(long timeMillis) { // 伪代码 : 通过取模上面的数组拿到对应的时间窗口 int idx = timeId % array.length() // 拿到当前时间窗口的起始时间 long windowStart = calculateWindowStart(timeMillis); while (true) { WindowWrap<T> old = array.get(idx); // ???? 1. 如果没有则创建新的窗口 if (old == null) { WindowWrap<T> window = new WindowWrap<T>(windowLengthInMs, windowStart, newEmptyBucket(timeMillis)); // ❓ : CAS 比较 , 避免多线程并发的问题 if (array.compareAndSet(idx, null, window)) { return window; } } else if (windowStart == old.windowStart()) { return old; } else if (windowStart > old.windowStart()) { // ???? 2 : 如果当前开始时间大于旧的时间窗口时间,说明已经到了下一轮时间窗口 // ❓ : 因为数组是恒定的 ,所以一轮过后需要覆盖 if (updateLock.tryLock()) { try { return resetWindowTo(old, windowStart); } finally { updateLock.unlock(); } } } else if (windowStart < old.windowStart()) { // ???? 2 : 说明出现了一次,不应该走这里 return new WindowWrap<T>(windowLengthInMs, windowStart, newEmptyBucket(timeMillis)); } } }

可以说这个滚动机制很简单了,就单纯的时间戳比较,核心的点在于 : 并发的控制和数组的设计

这是 Sentinel 最细粒度的窗口实现代码,基于这套代码既可以实现滚动的,也可以实现滑动的。 两者的区别在于 WindowWrap 的范围设置多大

3.3 flink 里面的时间窗口

除了做限流,时间窗口第二大用处就是做规定时间内的数据统计,以 Flink 为例:

Flink 中就有3种时间窗口方式,基于相同时间间隔的有 : 滚动时间窗口和滑动时间窗口 。而基于不同时间间隔的有 会话窗口(时间周期在一个会话之中)。

对于 会话窗口 ,其窗口的时间间隔是变动的 , 时间开始时间也不是确定的。

对于会话窗口的实现和滑动时间窗口大差不差,都是数据和窗口分离开。

四. 扩展

窗口的滚动不止在时间窗口上有体现,基于上述的代码我们能了解到,窗口的滚动无非就 比较 + 替换

最终归咎到就是数组的索引,那么不是时间戳也无所谓了。 那么类似的窗口又有哪些呢?

4.1 Redis 限流的滑动窗口

Redis 限流实现时间窗口的方式也不少,常见的方案有通过 ZSet 实现的,用过 ZSet 应该了解,这个数据类型内部会按照时间戳大小进行排序。所以也可以用来实现延时队列。

@ juejin.cn/post/701585…

数据集合 + 时间戳排序 = 时间窗口 。 妥妥的

4.2 分布式 ID 的滑动窗口

这里聊的就是百度的分布式ID算法了,也贼有意思。

分布式ID里面有一个很重要的点在于如何避免ID在并发里面重复。百度通过一个 RingBuffer 实现。

image.png

  • RingBuffer 的使用,不实时计算并发ID,预生成多个分布式ID进行保存
  • 也就是说一个在前面生产ID,一个在后面消费ID,像个窗口一样滚动

总结

小小看了一下,不算很深入,各位看官见谅~~~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅浅的聊一下时间窗口及其应用场景 的相关文章

随机推荐

  • 你会使用图片格式转换工具免费方法吗?教你转换格式吧

    前两天在网上看见一个聊天记录 是一个博主小A发的和老板的对话 小A 老板 这是你让我制作的我们产品的动图 你看看可以吗 发送了一张GIF 老板 不错不错 这次做的很好看 下周一我们开会的时候要用到这个图片 你记得把它打印出来 到时候给我一份
  • 高效整理文件的技巧和方法

    在日常生活和工作中 我们经常需要处理大量的文件 包括文档 图片 视频等 如果不能有效地整理这些文件 不仅会浪费大量的时间和精力 还可能导致重要文件的丢失或难以找到 因此 掌握一些整理文件的技巧方法是非常必要的 本文将介绍一些高效整理文件的技
  • 《VirtualLab Fusion物理光学实验教程》好书分享

    目录 第一章 物理光学概念介绍 6 1 1 几何光学和光线追迹 6 1 2 物理光学和光场追迹 6 1 3 电场 磁场以及坡印廷矢量 8 1 4 振幅 相位及实部和虚部 9 1 5 振幅 相位与偏振 10 1 6菲涅尔公式 11 1 7 全
  • Nginx配置文件全解析【深度剖析细节】

    简介 Nginx就是一个高性能的Web服务器和反向代理服务器 它可以处理大量的并发连接 支持高速缓存 负载均衡 SSL TLS终止 HTTP 2协议等功能 本篇主要讲述nginx的核心配置以及配置分析和优化 能够应用到你企业生产中为目的 基
  • 被确诊为“不适合保研”了……

    写在前面 伴随着 读研热 同辈压力 内卷 焦虑也成为了我们这一代人中的热词 作为同年级里的佼佼者 大多数保研er们无时无刻都不紧绷着心里的那根弦 可能在那些为了大创辗转反侧 为了绩点不停刷夜 为了论文焦头烂额的时候 保研er也许会犹豫 自己
  • MQ - 消息系统

    消息系统 1 消息系统的演变 在大型系统中 会需要和很多子系统做交互 也需要消息传递 在诸如此类系统中 你会找到源系统 消息发送方 和 目的系统 消息接收方 为了在这样的消息系统中传输数据 你需要有合适的数据管道 如下 这种数据的交互看起来
  • Mover Creator 用户界面

    1 开始 对话框 首次打开 Mover Creator 时 出现的第一个页面是 开始 对话框 如下所示 从这里开始 用户可以选择开始设计飞机 武器或发动机 在上述每种情况下 用户都可以创建新模型或编辑现有模型 1 1 新建模型 如果用户选择
  • 卷积神经网络中用1*1 卷积有什么作用或者好处呢?

    一 来源 1312 4400 Network In Network 如果1 1卷积核接在普通的卷积层后面 配合激活函数 即可实现network in network的结构 二 应用 GoogleNet中的Inception ResNet中的
  • 粗糙表面上的反射

    建模任务 当设计光学元件或组件时 由于制造工艺引入的偏差 最终元件的功能和理想模型并不一样 为了在本示例中模拟此效果 我们使用随机函数来创建粗糙曲面 此外 还研究了由表面不平度引起的散射效应 任务描述 粗糙表面 表面后的光场
  • pytorch如何生成小批量数据并传入神经网络?

    pytorch如何生成小批量数据并传入神经网络 第一部分 Excel表格数据的预处理 1 1 加载Excel数据 1 2 数据清洗 1 2 1 删除无用数据 1 2 2 填充缺失值 1 2 3 数据类型转换
  • 【已解决】ModuleNotFoundError: No module named ‘tensorboardX‘

    问题描述 Traceback most recent call last File train py line 84 in
  • OpenHarmony 实现屏幕横竖屏

    前言 OpenHarmony源码版本 4 0release 开发板 DAYU rk3568 一 修改 abilities 中的 orientation 实现横竖屏 当我们应用的Alility继承的是UIAbility时 对应的 module
  • 陶瓷材料检测项目及标准-科学指南针

    陶瓷原材料是用纯天然或生成化学物质历经成型和高溫煅烧做成的一类无机非金属原材料 它具备高溶点 高韧性 高耐磨性能 耐空气氧化等优势 可作为构造原材料 刀具材质 因为陶瓷还具备一些独特的性能 又可做为新型功能材料 各检测组织针对陶瓷检测的新项
  • 具有粗糙表面的回复反射器的反射

    系统设置 当试图将独立于入射方向的光大致反射回同一方向时 通常可以使用回复反射器 这个演示展示了如何在非序列场追迹的帮助下对这种结构进行建模 它还包括通过在表面上应用随机函数来对反射器壁的粗糙表面进行建模 任务描述 系统设置 仿真结果 涡流
  • 卖过房,进过厂,毕业两年后这个99年的小哥哥毅然转行车载测试,收入翻番!

    21年大学毕业的时候 我就知道可能接下来找工作是个难题 这年头 大学生早就不值钱了 毕业生人数一年比一年高 但企业的招聘岗位却只有那么几个 再加上疫情影响 各行各业都在缩减开支 减少招聘 985 211等重点大学的人才人家还挤破头 哪里还有
  • 开题报告-基于BS结构的NBA赛事系统设计与实现

    选题的国内外研究现状 众所周知 NAB联盟是全世界篮球最高水平的篮球联盟 NBA联盟代表着独特的篮球氛围 文化和劲爆的篮球水平 引领着世界篮球发展的趋势 对加快世界篮球水平的推动是至关重要的 近20年来 由于美国国内各职业体育联赛的迅速发展
  • 从抓包到接口测试,五分钟看完全过程解析,还说你不会测试?

    一 为什么抓包 1 从功能测试角度 通过抓包查看隐藏字段 Web 表单中会有很多隐藏的字段 这些隐藏字段一般都有一些特殊的用途 比如收集用户的数据 预防 CRSF 攻击 防网络爬虫 以及一些其他用途 这些隐藏字段在界面上都看不到 如果想检测
  • 镜像的优化

    一 镜像优化方法 查看上次装的镜像v1为525MB 对此进行优化 方法一 减少镜像的层数 清理镜像构建的中间产物 1 编辑docker目录中Dockerfile文件 利用shell命令对其进行减层以及清理和删包 2 创建镜像并对比 此时v2
  • pytorch中,如何将一个网络参数传给另一个相同网络的参数?

    要将一个网络的参数传递给另一个相同网络的参数 可以使用 state dict 方法和 load state dict 方法 假设有两个相同的网络 net1 和 net2 它们具有相同的网络结构 但是它们的权重和偏差不同 要将一个网络的参数传
  • 浅浅的聊一下时间窗口及其应用场景

    一 前言 时间窗口在限流 分布式 ID 的生成方面都有很多应用 这一篇主要目的是弄清楚怎么最好的实现这个功能 时间窗口的应用很多 可以用于统计和监控 也可以用于限流和流量控制 或者在指定窗口里面做实时计算 ID 生成等业务处理等 二 原理