5 个版本
0.1.5 | 2023 年 4 月 13 日 |
---|---|
0.1.4 | 2023 年 4 月 4 日 |
0.1.3 | 2023 年 3 月 30 日 |
6 在 #gossip-protocol
每月 34 次下载
89KB
1.5K SLoC
卡布多
卡布多是一个 Rust crate,包含 SWIM 成员消息协议的近似实现,细节可能有所不同。它可以用来在 LAN 上发现其他对等体,无需任何中心协调,准确跟踪成员资格,随着时间的推移,机器来来去去。
概念与特性
维基百科有 SWIM 协议的简要概述;我们不会详细介绍协议的工作原理。
卡布多通过在特定端口上发送 UDP 组播消息来发现本地网络上的潜在对等体。你选择的端口号由你决定;只需确保所有希望发现彼此的对等体都使用相同的端口号即可。使用卡布多的不同应用程序可以独立地在同一网络上运行,只要它们使用不同的端口号。
你可以选择告诉卡布多使用哪个网络接口。默认情况下,它将选择第一个非环回 IPv6 接口;如果没有可用,它将选择第一个非环回 IPv6 接口。
任何给定的 Kadoodle 运行副本都称为实例。卡布多不知道任何有关实例的信息——它在时间上没有持久身份,只是参与网状的对等体。根据你打算在卡布多之上构建的内容,你可能需要一个持久身份(例如某种机器 ID),你可以访问它。为此,你可以在实例化时为 Kadoodle 提供一个身份。卡布多身份是 Bytes 实例,并由系统视为完全不可透明的数据块;其含义完全取决于你。
检查网状结构
给定足够的时间,特定网状结构中的所有对等体应该会达成一致的看法——也就是说,每个对等体都应该知道其他每个对等体,并且他们都应该注意到某个对等体加入或离开网状结构。卡布多跟踪网状的“指纹”,它使用这个指纹来确保所有对等体对事物达成一致。
在任何时候,你可以检索网状的指纹和所有已知对等体的列表
let fingerprint = kaboodle.fingerprint().await;
let peers = kaboodle.peers().await;
println!("{fingerprint} {peers:?}");
指纹是从当前实例的角度对网格成员的CRC-32哈希值;网格中的所有机器应该能够快速收敛到相同的哈希值。对等节点列表是一个从对等节点的Kaboodle套接字地址映射到其身份的HashMap
注意事项和已知问题
该软件包仍处于早期积极开发阶段,可能还不适合生产使用。欢迎提交拉取请求、功能请求和反馈。
开发
本项目使用just (brew install just
)进行开发工作流程和自动化。不带参数运行just
以查看可用命令列表。
cargo run
将运行一个演示应用程序,通过端口7475寻找对等节点。如果您已安装zellij (brew install zellij
),您可以通过运行just run2x2
在2x2网格中运行四个演示应用程序的副本。尝试退出一些实例并观察剩余实例如何发现它们的缺失;每个面板上方都有一个标题,显示该实例的IP地址和端口号,以及从该节点角度的网格指纹。
许可证
依赖项
~8–19MB
~244K SLoC