limiter.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package ws
  2. import (
  3. "fmt"
  4. "golang.org/x/time/rate"
  5. "sync"
  6. "time"
  7. )
  8. var (
  9. limiterManagers map[string]*LimiterManger
  10. limiterOnce sync.Once
  11. limters = map[string]string{
  12. CONNECT_LIMITER: LIMITER_KEY,
  13. QA_LIMITER: CONNECT_LIMITER_KEY,
  14. }
  15. )
  16. const (
  17. CONNECT_LIMITER = "connetLimiter"
  18. QA_LIMITER = "qaLimiter"
  19. LIMITER_KEY = "llm_chat_key_user_%d"
  20. CONNECT_LIMITER_KEY = "llm_chat_connect_key_user_%d"
  21. RATE_LIMTER_TIME =30*time.Second
  22. )
  23. type RateLimiter struct {
  24. LastRequest time.Time
  25. *rate.Limiter
  26. }
  27. type LimiterManger struct {
  28. sync.RWMutex
  29. limiterMap map[string]*RateLimiter
  30. }
  31. //func (qaLimiter *QALimiter) Allow() bool {
  32. // return qaLimiter.Limiter.Allow()
  33. //}
  34. // GetLimiter 获取或创建用户的限流器
  35. func (qalm *LimiterManger) GetLimiter(token string) *RateLimiter {
  36. qalm.Lock()
  37. defer qalm.Unlock()
  38. if limiter, exists := qalm.limiterMap[token]; exists {
  39. return limiter
  40. }
  41. // 创建一个新的限流器,例如每10秒1个请求
  42. limiter := &RateLimiter{
  43. Limiter: rate.NewLimiter(rate.Every(RATE_LIMTER_TIME), 1),
  44. }
  45. qalm.limiterMap[token] = limiter
  46. return limiter
  47. }
  48. func (qalm *LimiterManger) Allow(token string) bool {
  49. limiter := qalm.GetLimiter(token)
  50. if limiter.LastRequest.IsZero() {
  51. limiter.LastRequest = time.Now()
  52. return limiter.Allow()
  53. }
  54. if time.Now().Sub(limiter.LastRequest) < RATE_LIMTER_TIME {
  55. return false
  56. }
  57. limiter.LastRequest = time.Now()
  58. return limiter.Allow()
  59. }
  60. func getInstance(key string) *LimiterManger {
  61. limiterOnce.Do(func() {
  62. if limiterManagers == nil {
  63. limiterManagers = make(map[string]*LimiterManger, len(limters))
  64. }
  65. for key, _ := range limters {
  66. limiterManagers[key] = &LimiterManger{
  67. limiterMap: make(map[string]*RateLimiter),
  68. }
  69. }
  70. })
  71. return limiterManagers[key]
  72. }
  73. func Allow(userId int, limiter string) bool {
  74. tokenKey := limters[limiter]
  75. if tokenKey == "" {
  76. return false
  77. }
  78. token := fmt.Sprintf(tokenKey, userId)
  79. handler := getInstance(limiter)
  80. if handler == nil {
  81. return false
  82. }
  83. return handler.Allow(token)
  84. }