1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- package ws
- import (
- "fmt"
- "golang.org/x/time/rate"
- "sync"
- "time"
- )
- var (
- limiterManager *QALimiterManger
- limiterOnce sync.Once
- )
- const (
- LIMITER_KEY = "llm_chat_key_user_%d"
- )
- type QALimiterManger struct {
- sync.RWMutex
- limiterMap map[string]*QALimiter
- }
- type QALimiter struct {
- LastRequest time.Time
- *rate.Limiter
- }
- //func (qaLimiter *QALimiter) Allow() bool {
- // return qaLimiter.Limiter.Allow()
- //}
- // GetLimiter 获取或创建用户的限流器
- func (qalm *QALimiterManger) GetLimiter(token string) *QALimiter {
- qalm.Lock()
- defer qalm.Unlock()
- if limiter, exists := qalm.limiterMap[token]; exists {
- return limiter
- }
- // 创建一个新的限流器,例如每10秒1个请求
- limiter := &QALimiter{
- Limiter: rate.NewLimiter(rate.Every(10*time.Second), 1),
- }
- qalm.limiterMap[token] = limiter
- return limiter
- }
- func (qalm *QALimiterManger) Allow(token string) bool {
- limiter := qalm.GetLimiter(token)
- if limiter.LastRequest.IsZero() {
- limiter.LastRequest = time.Now()
- return limiter.Allow()
- }
- if time.Now().Sub(limiter.LastRequest) < 10*time.Second {
- return false
- }
- limiter.LastRequest = time.Now()
- return limiter.Allow()
- }
- func getInstance() *QALimiterManger {
- limiterOnce.Do(func() {
- if limiterManager == nil {
- limiterManager = &QALimiterManger{
- limiterMap: make(map[string]*QALimiter),
- }
- }
- })
- return limiterManager
- }
- func Allow(userId int) bool {
- token := fmt.Sprintf(LIMITER_KEY, userId)
- return getInstance().Allow(token)
- }
|