diff --git a/proxyd/proxyd/backend_rate_limiter.go b/proxyd/proxyd/backend_rate_limiter.go index 03c6436..3cc6fae 100644 --- a/proxyd/proxyd/backend_rate_limiter.go +++ b/proxyd/proxyd/backend_rate_limiter.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "encoding/hex" "fmt" + "math" "sync" "time" @@ -256,5 +257,30 @@ func randStr(l int) string { return hex.EncodeToString(b) } -type ServerRateLimiter struct { +type NoopBackendRateLimiter struct{} + +var noopBackendRateLimiter = &NoopBackendRateLimiter{} + +func (n *NoopBackendRateLimiter) IsBackendOnline(name string) (bool, error) { + return true, nil +} + +func (n *NoopBackendRateLimiter) SetBackendOffline(name string, duration time.Duration) error { + return nil +} + +func (n *NoopBackendRateLimiter) IncBackendRPS(name string) (int, error) { + return math.MaxInt, nil +} + +func (n *NoopBackendRateLimiter) IncBackendWSConns(name string, max int) (bool, error) { + return true, nil +} + +func (n *NoopBackendRateLimiter) DecBackendWSConns(name string) error { + return nil +} + +func (n *NoopBackendRateLimiter) FlushBackendWSConns(names []string) error { + return nil } diff --git a/proxyd/proxyd/config.go b/proxyd/proxyd/config.go index d0a32d6..de221d9 100644 --- a/proxyd/proxyd/config.go +++ b/proxyd/proxyd/config.go @@ -41,13 +41,14 @@ type MetricsConfig struct { } type RateLimitConfig struct { - UseRedis bool `toml:"use_redis"` - BaseRate int `toml:"base_rate"` - BaseInterval TOMLDuration `toml:"base_interval"` - ExemptOrigins []string `toml:"exempt_origins"` - ExemptUserAgents []string `toml:"exempt_user_agents"` - ErrorMessage string `toml:"error_message"` - MethodOverrides map[string]*RateLimitMethodOverride `toml:"method_overrides"` + UseRedis bool `toml:"use_redis"` + EnableBackendRateLimiter bool `toml:"enable_backend_rate_limiter"` + BaseRate int `toml:"base_rate"` + BaseInterval TOMLDuration `toml:"base_interval"` + ExemptOrigins []string `toml:"exempt_origins"` + ExemptUserAgents []string `toml:"exempt_user_agents"` + ErrorMessage string `toml:"error_message"` + MethodOverrides map[string]*RateLimitMethodOverride `toml:"method_overrides"` } type RateLimitMethodOverride struct { diff --git a/proxyd/proxyd/integration_tests/testdata/backend_rate_limit.toml b/proxyd/proxyd/integration_tests/testdata/backend_rate_limit.toml index eca6580..e29bb19 100644 --- a/proxyd/proxyd/integration_tests/testdata/backend_rate_limit.toml +++ b/proxyd/proxyd/integration_tests/testdata/backend_rate_limit.toml @@ -15,4 +15,7 @@ max_rps = 2 backends = ["good"] [rpc_method_mappings] -eth_chainId = "main" \ No newline at end of file +eth_chainId = "main" + +[rate_limit] +enable_backend_limiter = true \ No newline at end of file diff --git a/proxyd/proxyd/proxyd.go b/proxyd/proxyd/proxyd.go index 5685633..3e21d71 100644 --- a/proxyd/proxyd/proxyd.go +++ b/proxyd/proxyd/proxyd.go @@ -53,11 +53,15 @@ func Start(config *Config) (func(), error) { var lim BackendRateLimiter var err error - if redisClient == nil { - log.Warn("redis is not configured, using local rate limiter") - lim = NewLocalBackendRateLimiter() + if config.RateLimit.EnableBackendRateLimiter { + if redisClient != nil { + lim = NewRedisRateLimiter(redisClient) + } else { + log.Warn("redis is not configured, using local rate limiter") + lim = NewLocalBackendRateLimiter() + } } else { - lim = NewRedisRateLimiter(redisClient) + lim = noopBackendRateLimiter } // While modifying shared globals is a bad practice, the alternative