net_pool/strategy/
strategy.rs

1use crate::backend::{Address, BackendState};
2
3#[derive(Debug, Clone, Eq, PartialEq)]
4pub enum Strategy {
5    /// 普通哈希
6    Hash,
7
8    /// 一致性哈希
9    ConsistentHash,
10
11    /// 轮询
12    RoundRobin,
13}
14
15/// 策略trait
16pub trait LbStrategy: Send + Sync {
17    /// 策略类型
18    fn strategy(&self) -> Strategy;
19
20    /// 判断一个后端地址是否存在
21    fn contain(&self, hash_code: u64) -> bool;
22
23    /// 添加一个后端地址
24    fn add_backend(&self, addr: Address);
25
26    /// 移除一个后端地址
27    fn remove_backend(&self, addr: &Address) -> bool;
28
29    /// 获取一个后端地址
30    fn get_backend(&self, key: &str) -> Option<BackendState>;
31
32    /// 获取所有后端地址
33    fn get_backends(&self) -> Vec<BackendState>;
34
35    /// 获取原始的所有后端地址
36    fn get_origin_backends(&self) -> Vec<BackendState>;
37
38    /// 获取一个后端地址, 通过通用key
39    fn backend<KEY: AsRef<str>>(this: Box<dyn LbStrategy>, key: KEY) -> Option<BackendState>
40    where
41        Self: Sized,
42    {
43        this.get_backend(key.as_ref())
44    }
45
46    /// 使一个后端地址无效
47    fn disable_backend(&self, addr: &Address) -> bool {
48        self.remove_backend(addr)
49    }
50
51    /// 使一个后端地址有效
52    fn enable_backend(&self, addr: &Address) {
53        self.add_backend(addr.clone())
54    }
55}