use std::time::Duration;
#[derive(Debug, Clone)]
pub enum BackpressureStrategy {
Block,
DropOldest,
DropNewest,
Throttle {
high_watermark: usize,
low_watermark: usize,
backoff: Duration,
},
}
pub struct BackpressureController {
strategy: BackpressureStrategy,
current_load: usize,
}
impl BackpressureController {
pub fn new(strategy: BackpressureStrategy) -> Self {
Self {
strategy,
current_load: 0,
}
}
pub fn should_apply_backpressure(&self) -> bool {
match &self.strategy {
BackpressureStrategy::Block => self.current_load > 0,
BackpressureStrategy::DropOldest | BackpressureStrategy::DropNewest => false,
BackpressureStrategy::Throttle { high_watermark, .. } => {
self.current_load >= *high_watermark
}
}
}
pub fn get_backoff(&self) -> Option<Duration> {
match &self.strategy {
BackpressureStrategy::Throttle { backoff, .. } => Some(*backoff),
_ => None,
}
}
pub fn update_load(&mut self, load: usize) {
self.current_load = load;
}
pub fn can_accept(&self) -> bool {
!self.should_apply_backpressure()
}
}