2个不稳定版本

0.2.0 2020年12月10日
0.1.0 2020年12月6日

#1443 in 算法

MIT 许可证

35KB
665

简介

这个crate是Jelasity等人提出的基于gossip的节点采样算法的Rust实现 [1]。它能够创建所有参与节点之间的覆盖网络,并用于gossip协议中的节点选择。

节点采样

在大型分布式系统中,使用gossip协议进行通信时,应在网络中随机选择节点。在理论上,这需要了解所有参与节点。《基于gossip的节点采样》 [1] 是Jelasity等人提出的一种算法,用于解决随机节点选择问题。

算法概述

该算法由节点交换观点的推送/拉取轮次组成。在每一轮中,一个节点随机选择一个节点,如果推送被启用,则推送其观点,或者推送一个空观点以触发拉取(如果推送被禁用)。选定的节点将处理接收到的观点,如果拉取被启用,则可能响应自己的观点。

当节点启动时,它要么连接到另一个节点以交换它们的观点,要么不知道任何其他节点并等待传入的推送请求(在网络中的初始节点的情况下)。

可以使用各种策略来启动网络(例如,一个初始节点,多个节点,DNS服务等)。这种行为可以在启动节点时提供的闭包参数中定义。

API

这个crate提供了一个包含文章中描述的两个方法的 PeerSamplingService

  • init:初始化节点采样协议
  • get_peer:为gossip协议返回一个随机节点

它还有一个 shutdown 方法来终止管理节点采样协议的不同线程。

配置

配置参数与论文中提出的相同

  • push:推送数据
  • pull:拉取数据
  • T:每个周期持续时间
  • c:本地视图大小
  • H:修复因子
  • S:交换因子

请参考文章以获取推荐的参数值。在我们的测试中,我们启用了推送和拉取,为c选择了16到30之间的值,并且有c/2 = H + S

示例

在下面的代码中,我们启动了一个没有任何接触对等体的第一个进程,以及一个只知道第一个进程的第二个进程。

启动不知道任何其他节点的初始对等体

// configuration
let config = Config::new("127.0.0.1:9000".parse().unwrap(), true, true, 6, 5, 20, 2, 8, None);

// closure that returns no contact peer
let no_initial_peer = Box::new(move|| { None });

// create and initiate the peer sampling service
let mut sampling_service = PeerSamplingService::new(config);
sampling_service.init(no_initial_peer);

...
// std::thread::sleep(std::time::Duration::from_secs(20));

// terminate peer sampling
sampling_service.shutdown().unwrap();

启动将连接到初始对等体的第二个对等体

// configuration
let config = Config::new("127.0.0.1:9001".parse().unwrap(), true, true, 6, 5, 20, 2, 8, None);

// closure for retrieving the address of the initial contact peer
let initial_peer = Box::new(move|| { Some(Peer::new("127.0.0.1:9000".to_owned())) });

// create and initiate the peer sampling service
let mut sampling_service = PeerSamplingService::new(config);
sampling_service.init(initial_peer);

...
// std::thread::sleep(std::time::Duration::from_secs(20));

// terminate peer sampling
sampling_service.shutdown().unwrap();

这里有61个本地进程可以获得的示例。

alt text

[1]: M. Jelasity, S. Voulgaris, R. Guerraoui, A.-M. Kermarrec, M. van Steen, 基于Gossip的对等体采样,2007

依赖关系

~610KB
~11K SLoC