go-common/app/job/main/videoup-report/model/email/detector.go
2019-04-22 18:49:16 +08:00

77 lines
2.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}