#dht #grpc #protocols #node #communication #algorithm #pastry

pastry-dht

使用Rust实现的Pastry DHT协议

8个版本

0.1.7 2023年11月13日
0.1.6 2023年11月13日

#24 in #dht

Download history

每月 54 次下载

自定义许可

110KB
2.5K SLoC

Pastry

一个可重用的Pastry DHT协议实现,使用gRPC进行节点通信。

有关算法,请参阅Pastry论文

使用方法

使用cargo安装

cargo install pastry-dht

或在Cargo.toml中包含 pastry-dht = "*"

示例

运行参数为 k=8 的简单PastryNode

为节点服务器创建二进制文件

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<String> = std::env::args().collect();
    let addr = args.get(1).unwrap().parse()?;
    let bootstrap_addr = args.get(2).map(|s| s.as_str());

    env_logger::Builder::from_default_env()
        .filter_level(log::LevelFilter::Info)
        .init();

    Ok(PastryNode::new(Config::new(8), addr, addr)?
        .bootstrap_and_serve(bootstrap_addr)
        .await?)
}

在三个不同的终端中运行

  1. cargorun 0.0.0.0:50000
  2. cargorun 0.0.0.0:50001 http://0.0.0.0:50000
  3. cargorun 0.0.0.0:50002 http://0.0.0.0:50001

这将启动一个3节点网络。

现在,为客户端创建二进制文件:使用 PastryClient 连接到节点并发送请求

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let args: Vec<String> = std::env::args().collect();
    let node_addr = args.get(1).unwrap();

    let mut client = PastryClient::connect(&node_addr).await?;

    client.set_kv("pastry".as_bytes(), "rocks!".as_bytes()).await?;
    let value = client.get_kv("pastry".as_bytes()).await?;
    println!("Value read from Pastry network: {}", String::from_utf8(value.unwrap())?);
    Ok(())
}

最后,在另一个终端中执行 cargo run http://0.0.0.0:50001

应该会打印 '从Pastry网络读取的值:rocks!'

TODO

  • 创建叶子集/路由表结构
  • 处理节点到达(加入)
  • 处理get/set/delete查询(查询)
  • 处理节点故障
  • 处理范围查询
  • 处理并发节点到达
  • 处理并发节点故障
  • 处理数据复制

依赖关系

~9–17MB
~207K SLoC