3 个版本
0.0.3 | 2020年12月25日 |
---|---|
0.0.2 | 2020年12月20日 |
0.0.1 | 2020年12月15日 |
1455 在 算法 中
每月 26 次下载
60KB
1K SLoC
演示
此包实现了一个可配置且通用的八卦协议,适用于应用程序。可以自定义八卦协议的所有方面(推送/拉取、八卦周期等),并且可以将任何可以以二进制格式表示的数据广播到网络中。
使用 基于八卦的节点采样 [1] 创建节点之间的覆盖网络。也可以自定义节点采样的配置。
八卦算法
八卦算法使网络中的信息传播成为可能。这是通过节点交换它们的知识来实现的。在每个回合,一个节点在网络上随机选择一个对等节点,并发送其知识状态。对等节点以自己的视角做出回应,并且每个对等节点都能够请求其缺失的视图部分。
基于八卦的节点采样
在大型分布式系统中,这些系统使用八卦协议向网络广播信息,应在网络中随机选择节点。从理论上讲,这需要了解所有参与的节点。因为节点不断进入和离开,这可能是不可行的。基于八卦的节点采样是由 Jelasity [1] 等人提出的算法,通过构建一个模拟随机视图的网络局部视图来解决随机节点选择问题。该算法由节点交换其网络视图的 push
和/或 pull
轮次组成。在每一轮中,一个节点随机选择一个节点,并发送其视图中的节点选择(如果启用了 push
),或者发送一个空视图以触发拉取(如果禁用了 push
)。选定的节点将处理收到的视图(可能是空的),并在启用了 pull
时回应自己的视图。
API
八卦功能由 GossipService
结构提供
start
在节点上启动八卦协议submit
向网络广播更新shutdown
在节点上终止八卦协议
初始化
要加入现有网络,新节点必须连接至少一个现有节点来了解其他节点。这是通过向start
方法提供一个返回Peer
列表的闭包来实现的。节点可以是硬编码的,也可以在闭包内部通过其他方式检索。
如果闭包没有返回Peer
,节点将等待其他节点的连接。
接收网络更新
其他节点广播的更新必须传递到应用层。为此,start
方法还需要一个实现UpdateHandler
特质的struct来处理从其他节点接收到的Update
消息。
示例
实现文本消息的简单处理程序
pub struct MyUpdateHandler;
impl UpdateHandler for MyUpdateHandler {
fn on_update(&self, update: Update) {
let _string_message = String::from_utf8(update.content().to_vec()).unwrap();
// do something with the message...
}
}
启动Gossip节点
fn main() {
// local machine IP and port for listening
let my_address = "127.0.0.1:9000";
// existing peer(s) in the network
let existing_peers = || Some(vec![ Peer::new("127.0.0.1:9001".to_owned()) ]);
// create and start the service
let mut gossip_service = GossipService::new_with_defaults(address.parse().unwrap());
gossip_service.start(Box::new(existing_peers), Box::new(MyUpdateHandler))?;
// submit a message
gossip_service.submit("Some random message".as_bytes().to_vec())?;
// shutdown the gossip protocol on exit
//gossip_service.shutdown();
}
[1]: M. Jelasity, S. Voulgaris, R. Guerraoui, A.-M. Kermarrec, M. van Steen, Gossip-based Peer Sampling, 2007
依赖项
~4MB
~92K SLoC