Commit e9f2c701 authored by Matthew Slipper's avatar Matthew Slipper

proxyd: Allow disabling backend rate limiting

The backend rate limiter is in place to protect upstreams like the sequencer. However, in many cases it isn't needed and it causes unnecessary requests to Redis. This PR allows this to be disabled, and disables this by default.
parent 1108348a
---
'@eth-optimism/proxyd': minor
---
Allow disabling backend rate limiter
...@@ -5,6 +5,7 @@ import ( ...@@ -5,6 +5,7 @@ import (
"crypto/rand" "crypto/rand"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"math"
"sync" "sync"
"time" "time"
...@@ -256,5 +257,30 @@ func randStr(l int) string { ...@@ -256,5 +257,30 @@ func randStr(l int) string {
return hex.EncodeToString(b) 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
} }
...@@ -41,13 +41,14 @@ type MetricsConfig struct { ...@@ -41,13 +41,14 @@ type MetricsConfig struct {
} }
type RateLimitConfig struct { type RateLimitConfig struct {
UseRedis bool `toml:"use_redis"` UseRedis bool `toml:"use_redis"`
BaseRate int `toml:"base_rate"` EnableBackendRateLimiter bool `toml:"enable_backend_rate_limiter"`
BaseInterval TOMLDuration `toml:"base_interval"` BaseRate int `toml:"base_rate"`
ExemptOrigins []string `toml:"exempt_origins"` BaseInterval TOMLDuration `toml:"base_interval"`
ExemptUserAgents []string `toml:"exempt_user_agents"` ExemptOrigins []string `toml:"exempt_origins"`
ErrorMessage string `toml:"error_message"` ExemptUserAgents []string `toml:"exempt_user_agents"`
MethodOverrides map[string]*RateLimitMethodOverride `toml:"method_overrides"` ErrorMessage string `toml:"error_message"`
MethodOverrides map[string]*RateLimitMethodOverride `toml:"method_overrides"`
} }
type RateLimitMethodOverride struct { type RateLimitMethodOverride struct {
......
...@@ -15,4 +15,7 @@ max_rps = 2 ...@@ -15,4 +15,7 @@ max_rps = 2
backends = ["good"] backends = ["good"]
[rpc_method_mappings] [rpc_method_mappings]
eth_chainId = "main" eth_chainId = "main"
\ No newline at end of file
[rate_limit]
enable_backend_limiter = true
\ No newline at end of file
...@@ -53,11 +53,15 @@ func Start(config *Config) (func(), error) { ...@@ -53,11 +53,15 @@ func Start(config *Config) (func(), error) {
var lim BackendRateLimiter var lim BackendRateLimiter
var err error var err error
if redisClient == nil { if config.RateLimit.EnableBackendRateLimiter {
log.Warn("redis is not configured, using local rate limiter") if redisClient != nil {
lim = NewLocalBackendRateLimiter() lim = NewRedisRateLimiter(redisClient)
} else {
log.Warn("redis is not configured, using local rate limiter")
lim = NewLocalBackendRateLimiter()
}
} else { } else {
lim = NewRedisRateLimiter(redisClient) lim = noopBackendRateLimiter
} }
// While modifying shared globals is a bad practice, the alternative // While modifying shared globals is a bad practice, the alternative
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment