- ebai限访问频率按门店来

This commit is contained in:
gazebo
2019-04-10 14:31:38 +08:00
parent df987cd93e
commit 9fd70a7446
4 changed files with 89 additions and 31 deletions

View File

@@ -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()
}