use crate::backend::{Address, BackendState};
pub enum Strategy {
Hash,
ConsistentHash,
RoundRobin,
}
pub trait LbStrategy: Send + Sync {
fn strategy(&self) -> Strategy;
fn contain(&self, hash_code: u64) -> bool;
fn add_backend(&self, addr: Address);
fn remove_backend(&self, addr: &Address) -> bool;
fn get_backend(&self, key: &str) -> Option<BackendState>;
fn get_backends(&self) -> Vec<BackendState>;
fn get_origin_backends(&self) -> Vec<BackendState>;
fn backend<KEY: AsRef<str>>(this: Box<dyn LbStrategy>, key: KEY) -> Option<BackendState>
where
Self: Sized,
{
this.get_backend(key.as_ref())
}
fn disable_backend(&self, addr: &Address) -> bool {
self.remove_backend(addr)
}
fn enable_backend(&self, addr: &Address) {
self.add_backend(addr.clone())
}
}