77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
|
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
|
|||
|
}
|