window

package
v0.0.0-...-2ebd195 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 29, 2022 License: MIT Imports: 5 Imported by: 0

README

window(滑动窗口)

常用于最近一段时间内的行为数据(状态)统计,如自适应熔断器,限流器等;类似于一个简单版本的时间序列内存数据库

  • winBucket:单个 <窗口>
  • Window:环形窗口队列
  • SliderWindow:基于 Window 基础实现了滑动机制

实现思路

  • 通过预先创建 winBucket 的机制,即当需要记录某个数据(指标)时再去检查并创建 winBucket
  • 当需要记录指标时,获取当前时间并通过一个算法确定到 winBucket ,并记录请求状态

WinBucket

type WinBucket struct {
	Sum   float64 // 成功统计的总数(当前窗口)
	Count int64   // 全部(总数,当前窗口)
}

每一个桶 WinBucket 存储了:

  • Sum:指标总数(通常为 succ)
  • Count:请求总数

SliderWindow 最后聚合计算的时候,通常会将 Sum 累计加作为分子,Count 累计加作为分母,从而可以统计出当前的成功 / 失败率。

窗口滑动的过程

滑动的本质

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type SliderWindow

type SliderWindow struct {
	sync.RWMutex
	// contains filtered or unexported fields
}

滑动窗口定义

func NewSliderWindow

func NewSliderWindow(opts ...SliderWindowOption) *SliderWindow

创建滑动窗口

func (*SliderWindow) Add

func (w *SliderWindow) Add(v float64)

向当前时间对应的bucket中追加数值 通过 lastTime 和 nowTime 的不断更新,通过不断重置来实现窗口滑动,新的数据不断补上,从而实现滑动窗口的累加计算

func (*SliderWindow) Reduce

func (w *SliderWindow) Reduce(fn func(b *WinBucket))

聚合滑动窗口中的所有有效bucket的数据

type SliderWindowOption

type SliderWindowOption func(sw *SliderWindow)

func IgnoreCurrentBucket

func IgnoreCurrentBucket() SliderWindowOption

func SetInterval

func SetInterval(interval time.Duration) SliderWindowOption

设置单个窗口代表多长的duration

func SetLogger

func SetLogger(logger *zap.Logger) SliderWindowOption

func SetWindowSize

func SetWindowSize(size int) SliderWindowOption

设置滑动窗口(环形)的大小

type WinBucket

type WinBucket struct {
	Sum   float64 // 成功统计的总数(当前窗口)
	Count int64   // 全部(总数,当前窗口)
}

type Window

type Window struct {
	// contains filtered or unexported fields
}

window is like a ring queue

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL