Skip to main content

RateLimiter

Struct RateLimiter 

Source
pub struct RateLimiter<S: RateLimitStore = InMemoryRateLimitStore> { /* private fields */ }
Expand description

Tower layer that rate-limits requests using a token bucket algorithm.

Requests that exceed the configured rate are delayed (not rejected), providing backpressure to clients while still eventually serving every request.

The rate limit key is derived from each request by a user-provided function. Use global or per_host for common strategies, or keyed for custom keying (e.g., per API key).

For multi-window limiting, stack multiple layers:

§Examples

use std::time::Duration;
use noxy::{Proxy, middleware::RateLimiter};

let proxy = Proxy::builder()
    .ca_pem_files("ca-cert.pem", "ca-key.pem")?
    .layer(RateLimiter::global(30, Duration::from_secs(1)))
    .layer(RateLimiter::keyed(100, Duration::from_secs(1), |req| {
        req.headers()
            .get("x-api-key")
            .and_then(|v| v.to_str().ok())
            .unwrap_or("anonymous")
            .to_string()
    }))
    .build()?;

Implementations§

Source§

impl<S: RateLimitStore> RateLimiter<S>

Source

pub fn with_store( store: S, key_fn: impl Fn(&Request<Body>) -> String + Send + Sync + 'static, ) -> Self

Create a rate limiter with a custom backend store and key function.

Source§

impl RateLimiter

Source

pub fn keyed( count: u64, window: Duration, key_fn: impl Fn(&Request<Body>) -> String + Send + Sync + 'static, ) -> Self

Rate-limit with a custom key function. Each distinct key gets its own token bucket. count requests are allowed per window duration.

Source

pub fn global(count: u64, window: Duration) -> Self

Rate-limit globally across all hosts with a single shared bucket. count requests are allowed per window duration.

Source

pub fn per_host(count: u64, window: Duration) -> Self

Rate-limit per unique hostname. Each host gets its own token bucket. count requests are allowed per window duration.

Source

pub fn burst(self, burst: u64) -> Self

Set the maximum burst size (max accumulated tokens). Defaults to count.

Source

pub fn max_keys(self, max: usize) -> Self

Soft cap for distinct keys tracked in memory. Idle keys are evicted first; if all keys are active, the map may temporarily exceed this value to preserve rate-limit correctness.

Source

pub fn idle_ttl(self, ttl: Duration) -> Self

Drop key state that has been idle longer than this duration.

Trait Implementations§

Source§

impl<S: RateLimitStore> Clone for RateLimiter<S>

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<S: RateLimitStore> Layer<BoxService<Request<BoxBody<Bytes, Box<dyn Error + Send + Sync>>>, Response<BoxBody<Bytes, Box<dyn Error + Send + Sync>>>, Box<dyn Error + Send + Sync>>> for RateLimiter<S>

Source§

type Service = RateLimiterService<S>

The wrapped service
Source§

fn layer(&self, inner: HttpService) -> Self::Service

Wrap the given service with the middleware, returning a new service that has been decorated with the middleware.

Auto Trait Implementations§

§

impl<S> Freeze for RateLimiter<S>
where S: Freeze,

§

impl<S = InMemoryRateLimitStore> !RefUnwindSafe for RateLimiter<S>

§

impl<S> Send for RateLimiter<S>

§

impl<S> Sync for RateLimiter<S>

§

impl<S> Unpin for RateLimiter<S>
where S: Unpin,

§

impl<S> UnsafeUnpin for RateLimiter<S>
where S: UnsafeUnpin,

§

impl<S = InMemoryRateLimitStore> !UnwindSafe for RateLimiter<S>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<'a, T, E> AsTaggedExplicit<'a, E> for T
where T: 'a,

Source§

fn explicit(self, class: Class, tag: u32) -> TaggedParser<'a, Explicit, Self, E>

Source§

impl<'a, T, E> AsTaggedImplicit<'a, E> for T
where T: 'a,

Source§

fn implicit( self, class: Class, constructed: bool, tag: u32, ) -> TaggedParser<'a, Implicit, Self, E>

Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more