- ebai限访问频率按门店来
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package platformapi
|
||||
|
||||
import (
|
||||
"math"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@@ -13,36 +14,45 @@ type LimiterConfig struct {
|
||||
}
|
||||
|
||||
type Limiter struct {
|
||||
limitConfig map[string]*ratelimit.Bucket
|
||||
defaultConfig *LimiterConfig
|
||||
limitBucketMap map[string]*ratelimit.Bucket
|
||||
limitConfigMap map[string]*LimiterConfig
|
||||
defaultConfig *LimiterConfig
|
||||
sync.RWMutex
|
||||
}
|
||||
|
||||
func New(config map[string]*LimiterConfig, defaultConfig ...*LimiterConfig) *Limiter {
|
||||
limiter := &Limiter{
|
||||
limitConfig: make(map[string]*ratelimit.Bucket),
|
||||
}
|
||||
for k, v := range config {
|
||||
limiter.limitConfig[k] = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
|
||||
limitConfigMap: config,
|
||||
limitBucketMap: make(map[string]*ratelimit.Bucket),
|
||||
}
|
||||
// for k, v := range config {
|
||||
// limiter.limitBucketMap[k] = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
|
||||
// }
|
||||
if len(defaultConfig) > 0 {
|
||||
limiter.defaultConfig = defaultConfig[0]
|
||||
}
|
||||
return limiter
|
||||
}
|
||||
|
||||
func (l *Limiter) AccessAPI(apiName string) {
|
||||
func (l *Limiter) AccessAPI(apiName, shopID string) {
|
||||
bucketKey := shopID + "." + apiName
|
||||
l.RLock()
|
||||
bucket := l.limitConfig[apiName]
|
||||
bucket := l.limitBucketMap[bucketKey]
|
||||
l.RUnlock()
|
||||
|
||||
if bucket == nil && l.defaultConfig != nil {
|
||||
if bucket == nil {
|
||||
l.Lock()
|
||||
if bucket = l.limitConfig[apiName]; bucket == nil {
|
||||
if v := l.defaultConfig; v != nil {
|
||||
bucket = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
|
||||
l.limitConfig[apiName] = bucket
|
||||
if bucket = l.limitBucketMap[bucketKey]; bucket == nil {
|
||||
v := l.limitConfigMap[apiName]
|
||||
if v == nil {
|
||||
v = l.defaultConfig
|
||||
}
|
||||
if v != nil {
|
||||
bucket = ratelimit.NewBucketWithQuantum(time.Duration(v.TimeGapMilliSecond)*time.Millisecond, int64(v.MaxAccessCount), int64(v.MaxAccessCount))
|
||||
} else {
|
||||
bucket = ratelimit.NewBucket(time.Second, math.MaxInt64) // 占位用
|
||||
}
|
||||
l.limitBucketMap[bucketKey] = bucket
|
||||
}
|
||||
l.Unlock()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user