#gossip-protocol #distributed-systems #random-graph #peer-sampling #overlay-network

八卦

一个基于八卦的通用库,用于基于八卦的节点采样

3 个版本

0.0.3 2020年12月25日
0.0.2 2020年12月20日
0.0.1 2020年12月15日

1455算法

每月 26 次下载

MIT 许可证

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