load-balancer 0.6.0

Asynchronous load balancing utilities for Rust — round-robin, random, cooldown, window, fault-tolerant, proxy pool with health checks, and token-bucket rate limiting.
Documentation
//! # Load Balancer Library
//!
//! This library provides a set of generic load balancer implementations for distributing
//! workloads across multiple targets, such as clients, network endpoints, or resources.
//!
//! ## Traits
//!
//! ### `LoadBalancer<T>`
//!
//! A generic trait for asynchronous or synchronous load balancing. Implementors provide
//! methods to allocate a resource from the pool.
//!
//! ```rust
//! use std::future::Future;
//!
//! pub trait LoadBalancer<T>: Send + Sync + Clone + 'static {
//!     /// Asynchronously allocate a resource.
//!     fn alloc(&self) -> impl Future<Output = T> + Send;
//!
//!     /// Attempt to allocate a resource synchronously without awaiting.
//!     fn try_alloc(&self) -> Option<T>;
//! }
//! ```
//!
//! ### `FilteredLoadBalancer<T>`
//!
//! A trait for load balancers that support predicate-based filtering.  Unlike
//! [`LoadBalancer`], filter methods return `(usize, T)` — the entry index
//! alongside the value — so callers can identify the allocated entry.
//!
//! ```rust
//! use std::future::Future;
//!
//! pub trait FilteredLoadBalancer<T>: Send + Sync + Clone + 'static {
//!     /// Asynchronously allocate an entry that satisfies the given predicate.
//!     fn alloc_filter(
//!         &self,
//!         predicate: impl FnMut((usize, &T)) -> bool,
//!     ) -> impl Future<Output = (usize, T)> + Send;
//!
//!     /// Attempt to allocate an entry that satisfies the predicate without awaiting.
//!     fn try_alloc_filter(
//!         &self,
//!         predicate: impl FnMut((usize, &T)) -> bool,
//!     ) -> Option<(usize, T)>;
//! }
//! ```

/// Cooldown-based load balancer with per-entry reuse intervals.
pub mod cooldown;
/// Fault-tolerant load balancer with error tracking and auto-disabling.
pub mod fault_tolerant;
/// Proxy pool with health checking and latency-based sorting.
pub mod proxy_pool;
/// Random selection load balancer.
pub mod random;
/// Fixed-window rate limiter (single + per-key map).
pub mod rate_limit;
/// Round-robin sequential load balancer.
pub mod round_robin;
/// Sliding-window load balancer with per-entry rate limits.
pub mod window;

pub use anyhow;
pub use dashmap;
pub use reqwest;

/// A generic load balancer trait for allocating resources from a pool.
///
/// Implementors manage a collection of items and distribute them according to
/// their specific strategy (round-robin, random, cooldown, etc.).
pub trait LoadBalancer<T>: Send + Sync + Clone + 'static {
    /// Asynchronously allocate a resource from the pool.
    fn alloc(&self) -> impl Future<Output = T> + Send;
    /// Attempt to allocate a resource synchronously without awaiting.
    fn try_alloc(&self) -> Option<T>;
}

/// A load balancer that supports predicate-based filtering during allocation.
///
/// Unlike [`LoadBalancer`], filter methods return `(usize, T)` so callers
/// can identify the allocated entry (e.g. for error feedback).
pub trait FilteredLoadBalancer<T>: Send + Sync + Clone + 'static {
    /// Asynchronously allocate an entry that satisfies the given predicate.
    fn alloc_filter(
        &self,
        predicate: impl FnMut((usize, &T)) -> bool + Send,
    ) -> impl Future<Output = (usize, T)> + Send;
    /// Attempt to allocate an entry that satisfies the predicate without awaiting.
    fn try_alloc_filter(&self, predicate: impl FnMut((usize, &T)) -> bool) -> Option<(usize, T)>;
}