pub struct RedisRateLimiterConfig {
pub url: String,
pub fail_open: bool,
pub key_prefix: String,
pub connection_timeout_ms: u64,
pub key_ttl_s: u64,
pub ha: RedisHaConfig,
}Expand description
Distributed Redis-backed GCRA rate limiter config (DW-031,
gateway.redis_rate_limiter).
When present and the ent cargo feature is compiled in AND a valid
license with the redis_rate_limiter feature claim is loaded, the gateway
uses a Redis-backed GCRA rate limiter instead of the local in-memory
one — so two or more gateway instances share one rate limit per key. The
same stacked-window GCRA semantics run, but the per-key TAT lives in
Redis and is updated atomically via a Lua script in a single round-trip.
When the ent feature is NOT compiled in, or the license lacks the
claim, the block is accepted but inert (the local GCRA limiter is used).
When Redis is unreachable, fail_open (default true) lets requests
through; set it to false to reject with 429 instead.
Fields§
§url: StringRedis connection URL (e.g. redis://127.0.0.1:6379 or
redis-cluster://...). The connection is established once at
startup and pooled via a multiplexed ConnectionManager.
fail_open: boolFail-open behavior when Redis is unreachable (default true):
true allows the request (no rate limiting); false rejects
with 429. Fail-open is the safer default for availability — a
Redis outage should not take down the gateway — but operators
who need hard limits can set this to false.
key_prefix: StringPrefix for rate-limit keys in Redis (default dwara:rl:). Each
rule’s per-key bucket is stored as {prefix}{key}:{window_index}.
connection_timeout_ms: u64Connection timeout in milliseconds (default 1000; validated to 100..=30 000). The timeout applies to the initial connection establishment at startup, not to per-request Lua script calls (those use the pooled connection’s own timeout).
key_ttl_s: u64TTL for rate-limit keys in Redis, in seconds (default 3600). Stale keys auto-expire so a key that stops receiving traffic does not accumulate forever. The per-window GCRA Lua script also sets an EXPIRE based on the burst tolerance; this value is a floor that ensures cleanup even for long-burst windows.
ha: RedisHaConfigHA and topology config (SCALE-11, #248). Controls whether the gateway connects to a single Redis, a Sentinel deployment, or a Redis Cluster. Defaults to single-instance mode (the existing behavior).
Trait Implementations§
Source§impl Clone for RedisRateLimiterConfig
impl Clone for RedisRateLimiterConfig
Source§fn clone(&self) -> RedisRateLimiterConfig
fn clone(&self) -> RedisRateLimiterConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for RedisRateLimiterConfig
impl Debug for RedisRateLimiterConfig
Source§impl<'de> Deserialize<'de> for RedisRateLimiterConfig
impl<'de> Deserialize<'de> for RedisRateLimiterConfig
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Source§impl JsonSchema for RedisRateLimiterConfig
impl JsonSchema for RedisRateLimiterConfig
Source§fn schema_id() -> Cow<'static, str>
fn schema_id() -> Cow<'static, str>
Source§fn json_schema(generator: &mut SchemaGenerator) -> Schema
fn json_schema(generator: &mut SchemaGenerator) -> Schema
Source§fn inline_schema() -> bool
fn inline_schema() -> bool
$ref keyword. Read moreSource§impl PartialEq for RedisRateLimiterConfig
impl PartialEq for RedisRateLimiterConfig
Source§impl Serialize for RedisRateLimiterConfig
impl Serialize for RedisRateLimiterConfig
impl StructuralPartialEq for RedisRateLimiterConfig
Auto Trait Implementations§
impl Freeze for RedisRateLimiterConfig
impl RefUnwindSafe for RedisRateLimiterConfig
impl Send for RedisRateLimiterConfig
impl Sync for RedisRateLimiterConfig
impl Unpin for RedisRateLimiterConfig
impl UnwindSafe for RedisRateLimiterConfig
Blanket Implementations§
§impl<T> AnyExt for T
impl<T> AnyExt for T
§fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
fn downcast_ref<T>(this: &Self) -> Option<&T>where
T: Any,
T behind reference§fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
fn downcast_mut<T>(this: &mut Self) -> Option<&mut T>where
T: Any,
T behind mutable reference§fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
fn downcast_rc<T>(this: Rc<Self>) -> Result<Rc<T>, Rc<Self>>where
T: Any,
T behind Rc pointer§fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
fn downcast_arc<T>(this: Arc<Self>) -> Result<Arc<T>, Arc<Self>>where
T: Any,
T behind Arc pointer§fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
fn downcast_box<T>(this: Box<Self>) -> Result<Box<T>, Box<Self>>where
T: Any,
T behind Box pointer§fn downcast_move<T>(this: Self) -> Option<T>
fn downcast_move<T>(this: Self) -> Option<T>
Self to T,
useful only in generic context as a workaround for specializationSource§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
impl<T, X> CoerceTo<T> for Xwhere
T: CoerceFrom<X> + ?Sized,
fn coerce_rc_to(self: Rc<X>) -> Rc<T>
fn coerce_box_to(self: Box<X>) -> Box<T>
fn coerce_ref_to(&self) -> &T
fn coerce_mut_to(&mut self) -> &mut T
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more