2个不稳定版本
0.2.0 | 2020年12月10日 |
---|---|
0.1.0 | 2020年12月6日 |
#1443 in 算法
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个本地进程可以获得的示例。
[1]: M. Jelasity, S. Voulgaris, R. Guerraoui, A.-M. Kermarrec, M. van Steen, 基于Gossip的对等体采样,2007
依赖关系
~610KB
~11K SLoC