Golang Go语言中实现一个高效的滑动时间窗口计数器

发布于 1周前 作者 h691938207 来自 Go语言

适合用于计算最近一段时间的样本均值

典型应用场景:成功率限流、QPS 限流

https://github.com/go-tk/stw


Golang Go语言中实现一个高效的滑动时间窗口计数器
11 回复

集群做不到统一滑动吧?

更多关于Golang Go语言中实现一个高效的滑动时间窗口计数器的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


当然是各自滑各自的

没有 benchmark 怎么能说高效呢

为什么有成熟稳定大规模落地的东西不直接用呢?

退一步将,大多数时候看汽车轮子比造牛车轮子的收益大很多

普罗米修斯怎么样

关于滑动时间窗口计数器,我的实现思路非常"取巧",代码短少,翻了一下 github 还没找到和我思路类似的实现,可以把你认为成熟实现贴出来和大家分享

已经看过了,你能说说 sentinel-golang 实现的滑动时间窗口有啥亮点吗?

没做过对比

在Golang中实现一个高效的滑动时间窗口计数器,可以采用环形缓冲区(Circular Buffer)和哈希表(Hash Table)结合的策略。这种方法能够高效地管理固定大小的时间窗口内的计数。

首先,定义一个环形缓冲区来存储时间戳和对应的计数。缓冲区的大小应根据时间窗口的大小(例如,过去一分钟内的计数,假设每秒更新一次,则缓冲区大小为60)。

其次,使用哈希表来快速查找和更新特定时间戳的计数。哈希表的键是时间戳,值是对应的计数。

实现步骤如下:

  1. 初始化环形缓冲区和哈希表。
  2. 当新事件到达时,获取当前时间戳。
  3. 检查时间戳是否在窗口内(即在缓冲区索引范围内)。
    • 如果在,更新哈希表中该时间戳的计数。
    • 如果不在,更新缓冲区,移除旧的时间戳和计数,并将新时间戳及其计数加入缓冲区和哈希表。
  4. 如果需要查询当前窗口内的总计数,遍历哈希表累加所有值。

为了进一步优化性能,可以使用锁(如sync.Mutex)或原子操作(如sync/atomic包中的函数)来确保并发安全。

此外,还可以根据具体应用场景调整时间窗口大小和更新频率,以达到最佳性能和精度。

这种实现方法结合了环形缓冲区的空间效率和哈希表的查找效率,能够高效处理滑动时间窗口计数问题。

回到顶部