go-common/app/job/main/videoup-report/model/email/detector.go

77 lines
2.1 KiB
Go
Raw Normal View History

2019-04-22 10:49:16 +00:00
package email
import (
"fmt"
"time"
)
//FastDetector detecte speed and unique analyze
type FastDetector struct {
lastSec int64
sameSecCnt int
sameSecThreshold int
overspeedCnt int
overspeedThreshold int
uniqueSpeed map[int64]int
fastUnique int64
}
//NewFastDetector new
func NewFastDetector(speedThreshold, overspeedThreshold int) *FastDetector {
return &FastDetector{
lastSec: time.Now().Unix(),
sameSecCnt: 0,
sameSecThreshold: speedThreshold,
overspeedCnt: 0,
overspeedThreshold: overspeedThreshold,
uniqueSpeed: map[int64]int{},
}
}
//String string info
func (fd *FastDetector) String() string {
return fmt.Sprintf("same_sec_cnt=%d,overspeed_cnt=%d,fast_unique=%d,unique_speed=%v",
fd.sameSecCnt, fd.overspeedCnt, fd.fastUnique, fd.uniqueSpeed)
}
//Detect 快慢探查, 超限名单只能被慢速/下一个超速名单/间隔5s后空名单代替超限名单只有在(overspeedthreshold+1) * samesecthreshold时才确定此时返回true
func (fd *FastDetector) Detect(unique int64) (fast bool) {
now := time.Now().Unix()
//连续n次超限
if now == fd.lastSec {
fd.sameSecCnt++
if fd.sameSecCnt == fd.sameSecThreshold {
fd.overspeedCnt++
}
} else {
if fd.sameSecCnt < fd.sameSecThreshold || (now-fd.lastSec > 5) {
fd.overspeedCnt = 0
fd.fastUnique = 0
fd.uniqueSpeed = map[int64]int{}
}
fd.sameSecCnt = 1
fd.lastSec = now
}
//连续超限后最先超限的unique指定为超限名单
if fd.overspeedCnt == fd.overspeedThreshold && fd.sameSecCnt == fd.sameSecThreshold {
fd.uniqueSpeed[unique] = 0
}
if (fd.overspeedCnt == fd.overspeedThreshold && fd.sameSecCnt != fd.sameSecThreshold) || (fd.overspeedCnt > fd.overspeedThreshold) {
fd.uniqueSpeed[unique]++
if fd.uniqueSpeed[unique] >= fd.sameSecThreshold {
fast = true
fd.fastUnique = unique //指定超限名单
fd.uniqueSpeed = map[int64]int{}
fd.overspeedCnt = 0
}
}
return
}
//IsFastUnique 是否为超限名单
func (fd *FastDetector) IsFastUnique(unique int64) bool {
return fd.fastUnique == unique
}