8个版本
0.1.7 | 2023年11月13日 |
---|---|
0.1.6 | 2023年11月13日 |
#24 in #dht
每月 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?)
}
在三个不同的终端中运行
cargorun 0.0.0.0:50000
cargorun 0.0.0.0:50001 http://0.0.0.0:50000
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