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 的更新問題,尤其是超過兩輪沒有更新時如何補上空缺的資料

Releases

No releases published

Packages

No packages published

Languages