limiter.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. package ws
  2. import (
  3. "fmt"
  4. "golang.org/x/time/rate"
  5. "sync"
  6. "time"
  7. )
  8. var (
  9. limiterManager *QALimiterManger
  10. limiterOnce sync.Once
  11. )
  12. const (
  13. LIMITER_KEY = "llm_chat_key_user_%d"
  14. )
  15. type QALimiterManger struct {
  16. sync.RWMutex
  17. limiterMap map[string]*QALimiter
  18. }
  19. type QALimiter struct {
  20. LastRequest time.Time
  21. *rate.Limiter
  22. }
  23. //func (qaLimiter *QALimiter) Allow() bool {
  24. // return qaLimiter.Limiter.Allow()
  25. //}
  26. // GetLimiter 获取或创建用户的限流器
  27. func (qalm *QALimiterManger) GetLimiter(token string) *QALimiter {
  28. qalm.Lock()
  29. defer qalm.Unlock()
  30. if limiter, exists := qalm.limiterMap[token]; exists {
  31. return limiter
  32. }
  33. // 创建一个新的限流器,例如每10秒1个请求
  34. limiter := &QALimiter{
  35. Limiter: rate.NewLimiter(rate.Every(10*time.Second), 1),
  36. }
  37. qalm.limiterMap[token] = limiter
  38. return limiter
  39. }
  40. func (qalm *QALimiterManger) Allow(token string) bool {
  41. limiter := qalm.GetLimiter(token)
  42. if limiter.LastRequest.IsZero() {
  43. limiter.LastRequest = time.Now()
  44. return limiter.Allow()
  45. }
  46. if time.Now().Sub(limiter.LastRequest) < 10*time.Second {
  47. return false
  48. }
  49. limiter.LastRequest = time.Now()
  50. return limiter.Allow()
  51. }
  52. func getInstance() *QALimiterManger {
  53. limiterOnce.Do(func() {
  54. if limiterManager == nil {
  55. limiterManager = &QALimiterManger{
  56. limiterMap: make(map[string]*QALimiter),
  57. }
  58. }
  59. })
  60. return limiterManager
  61. }
  62. func Allow(userId int) bool {
  63. token := fmt.Sprintf(LIMITER_KEY, userId)
  64. return getInstance().Allow(token)
  65. }