#一致性哈希 #哈希 #一致性 #pingora #哈希

pingora-ketama

Rust版的nginx一致性哈希函数

4个版本 (2个破坏性更新)

0.3.0 2024年7月12日
0.2.0 2024年5月10日
0.1.1 2024年4月18日
0.1.0 2024年2月28日

算法类别中排名1788

Download history 688/week @ 2024-04-26 490/week @ 2024-05-03 625/week @ 2024-05-10 574/week @ 2024-05-17 501/week @ 2024-05-24 348/week @ 2024-05-31 461/week @ 2024-06-07 450/week @ 2024-06-14 589/week @ 2024-06-21 628/week @ 2024-06-28 585/week @ 2024-07-05 868/week @ 2024-07-12 577/week @ 2024-07-19 685/week @ 2024-07-26 741/week @ 2024-08-02 712/week @ 2024-08-09

每月下载量2,834
7个crate中使用(通过pingora-load-balancing

Apache-2.0

44KB
303

pingora-ketama

nginx一致性哈希算法的Rust版

此crate提供了一致性哈希算法,其行为与nginx一致性哈希相同。

当需要最小化节点添加或删除时需要重新哈希到不同节点上的请求数量时,使用此类一致性哈希策略非常有用。

以下是一个简单示例,说明如何使用它

use pingora_ketama::{Bucket, Continuum};

fn main() {
    // Set up a continuum with a few nodes of various weight.
    let mut buckets = vec![];
    buckets.push(Bucket::new("127.0.0.1:12345".parse().unwrap(), 1));
    buckets.push(Bucket::new("127.0.0.2:12345".parse().unwrap(), 2));
    buckets.push(Bucket::new("127.0.0.3:12345".parse().unwrap(), 3));
    let ring = Continuum::new(&buckets);

    // Let's see what the result is for a few keys:
    for key in &["some_key", "another_key", "last_key"] {
        let node = ring.node(key.as_bytes()).unwrap();
        println!("{}: {}:{}", key, node.ip(), node.port());
    }
}
# Output:
some_key: 127.0.0.3:12345
another_key: 127.0.0.3:12345
last_key: 127.0.0.2:12345

我们在pingora-ketama/examples/health_aware_selector.rs中提供了一个健康感知的示例。

有关精心制作的实际示例,请参阅pingora-load-balancing crate。

依赖项

~78KB