Skip to content

davidleitw/Sliding

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

16 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Sliding

簡介

Sliding 是一個基於 sliding window algorithm 的輕量級 library。開發它的靈感來自於一些微服務限流專案(Ex: guava,Sentinal) 中關於統計 QPS 的作法,透過將一些簡單的操作封裝,可以有效的省去開發的成本。

對於一些需要統計單位時間內發生事件的場景,都可以利用 Sliding 去簡單的統計資料,Sliding 可以自訂 Upload function,用來處理 window 滑動後,原本位於 window 的資料要怎麼處理,寫入資料庫,或者根據設定的 threshold 去觸發某些行為等等。

Installation

go get github.com/davidleitw/Sliding/pkg/slidingwindow

include

import "github.com/davidleitw/Sliding/pkg/slidingwindow"

概念

在建立 Sliding window 的時候可以指定 windowSizewindowLength

  • windowSize: 單一窗口時間,用 ms 為單位
  • windowLength: 總共有幾個 window

創立一個 windowSize=125ms, windowLength=8Sliding Window 可以參考以下範例,這樣一輪總共有 1000ms = 1s

slw := slidingwindow.NewSlidingWindows(125, 8, nil)

可以簡單用上圖的例子來說明 Sliding window 的運作原理

假設今天要紀錄的資料發生在487ms,我們可以透過 (487 / windowSize) % wnidowLength 來求出 index=3,我們也可以透過 487 - (487 % windowLength) 來算出這輪的 start = 375

Sliding window 創立之後怎麼滑動呢? 可以用下面的圖片說明,一開始的步驟都像上面,但是不一樣的地方在於算出來的 start=48763 會跟 windows[index].start 先比大小,如果發現新出來的 start 大於原本 windowstart,就會更新相關的資料,在 Sliding 內會分成兩個部份執行

  • 更新 windowstart
  • 執行使用者設定的 upload function,處理 window 更新前存在內部的統計資料,會在後續的範例中看到詳細的用法

範例

動工中

參考文章

動工中

TODO

  • 思考兩個使用範例
    • 整合 InfluxDB, Grafana 呈現
  • 思考 window 的更新問題,尤其是超過兩輪沒有更新時如何補上空缺的資料

About

一個基於 sliding window 概念的輕量級 go library.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy