Golang 業務限流器

github地址 https://github.com/xiaowei520...

package core

import (
    "math/rand"
    "sync"
    "sync/atomic"
    "time"
)

//使用cas 鎖來實現、減少開銷
//業務限流器
const (
    Normal = iota
    AbNormal
)

//標示, 可以是appId  uid 唯一性的代表值
type Limit float64

type Limiter struct {
    limit     Limit
    EventName string
    //cas
    done uint32

    //時間
    retryTime int
    //重試次數
    retryLen int

    //最大緩衝時間
    maxTime int64
    //最小緩衝時間
    minTime int64

    mu sync.Mutex
    // last is the last time the limiter's tokens field was updated
    last time.Time
    // lastEvent is the latest time of a rate-limited event (past or future)
    lastEvent time.Time
}

func NewLimiter(r Limit, n string) *Limiter {

    return &Limiter{
        limit:     r,
        EventName: n,
    }
}

func DefaultLimiter(r Limit, n string) *Limiter {
    return &Limiter{
        limit:     r,
        EventName: n,
        maxTime:   1000,
        minTime:   100,
    }
}

func (lim *Limiter) Allow() bool {
    //no limit rate
    if atomic.LoadUint32(&lim.done) == Normal {
        return true
    }
    //rand sleep, avoid conflict
    randTime := rand.Int63n(lim.maxTime-lim.minTime) + lim.minTime
    time.Sleep(time.Duration(randTime) * time.Millisecond)
    return false
}

//where use stop
func (lim *Limiter) Stop() bool {
    lim.mu.Lock()
    defer lim.mu.Unlock()
    if lim.done == Normal {
        defer atomic.StoreUint32(&lim.done, AbNormal)
    }

    return true
}

func (lim *Limiter) Recover() bool {
    lim.mu.Lock()
    defer lim.mu.Unlock()
    if lim.done == AbNormal {
        defer atomic.StoreUint32(&lim.done, Normal)
    }
    return true
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章