#swim #service-discovery #memberlist #gossip #networking

无需 std foca

基于 Gossip 的集群成员发现,基于 SWIM

21 个版本 (破坏性更新)

0.17.2 2024 年 6 月 4 日
0.17.0 2024 年 3 月 20 日
0.16.0 2023 年 10 月 1 日
0.13.0 2023 年 7 月 9 日
0.1.0 2021 年 11 月 4 日

#93网络编程

Download history 54/week @ 2024-05-01 80/week @ 2024-05-08 90/week @ 2024-05-15 106/week @ 2024-05-22 266/week @ 2024-05-29 359/week @ 2024-06-05 302/week @ 2024-06-12 308/week @ 2024-06-19 472/week @ 2024-06-26 311/week @ 2024-07-03 656/week @ 2024-07-10 621/week @ 2024-07-17 858/week @ 2024-07-24 776/week @ 2024-07-31 618/week @ 2024-08-07 385/week @ 2024-08-14

每月 2,823 次下载
3 crate 中使用

MPL-2.0 许可证

275KB
5K SLoC

Foca:按您的需求进行集群成员发现

Foca 是基于 Gossip 的集群发现的基础组件。它是一个小型 no_std + alloc crate,实现了 SWIM 协议及其有用的扩展(SWIM+Inf.+Susp.)。

项目

简介

Foca 最显著的特点是它几乎什么也不做。开箱即用,它提供的只是一个可靠且高效的、对传输和身份无关的 SWIM 协议 实现。

了解 SWIM 的工作原理有帮助但不是必需的,以使用此库。阅读 Message 枚举的文档应该能让你了解协议的工作原理,但论文非常易于阅读。

Foca 被设计成可以适应任何类型的传输:如果您的网络允许对等节点相互通信,您就可以在该网络上部署 Foca。不仅带宽需求很低,而且您还可以完全控制成员如何相互识别(参见 ./examples/identity_golf.rs)以及如何编码消息。

使用方法

请查看 ./examples/foca_insecure_udp_agent.rs。它展示了基于 tokio 的简单代理的样子,并让您实际运行并看到 Foca 如何游泳。

$ cargo run --features std,tracing,bincode-codec --example foca_insecure_udp_agent -- --help
foca_insecure_udp_agent 

USAGE:
    foca_insecure_udp_agent [OPTIONS] <BIND_ADDR>

FLAGS:
    -h, --help       Prints help information
    -V, --version    Prints version information

OPTIONS:
    -a, --announce <announce>    Address to another Foca instance to join with
    -f, --filename <filename>    Name of the file that will contain all active members
    -i, --identity <identity>    The address cluster members will use to talk to you.
                                 Defaults to BIND_ADDR

ARGS:
    <BIND_ADDR>    Socket address to bind to. Example: 127.0.0.1:8080

您可以使用以下命令在一个终端中启动代理:./foca_insecure_udp_agent 127.0.0.1:8000,并通过不同的BIND_ADDR--announce与多个实例连接。例如:./foca_insecure_udp_agent 127.0.0.1:8001 -a 127.0.0.1:8000

代理通过tracing的订阅者向控制台输出一些信息。它默认为INFO日志级别,可以通过RUST_LOG环境变量使用tracing_subscriber的EnvFilter指令进行自定义。

Cargo功能

每个功能都是可选的。默认集将始终为空。

  • std:添加对std::error::Error的支持,实现了foca::Identitystd::net::SocketAddr*的支持,并暴露了Config::new_lanConfig::new_wan
  • tracing:使用tracing crate对Foca进行仪器化。高级协议交互作为DEBUG跟踪发出,更多详细信息可以通过TRACE级别暴露。不会发出其他级别。
  • serde:为Foca的公共类型推导出SerializeDeserialize
  • bincode-codec:提供BincodeCodec,一个基于serde的codec类型,底层使用bincode
  • postcard-codec:提供PostcardCodec,一个基于serde的、对no_std友好的codec,底层使用postcard

注意

在编写这个库时,主要目标是拥有一个简单、小巧的核心,易于测试、模拟和推理;这主要是为了在阅读论文后更好地理解协议。

遵循这些目标自然导致了不依赖于许多操作系统功能(如硬件时钟、原子和线程)的实现,因此成为一个no_std crate(尽管仍然需要堆分配)是一个相当意外的优点,我决定坚持。

与memberlist的比较

在我对自己的实现满意之前,我避免查看memberlist。从那时起,我只进行了非彻底的查看。

  • memberlist支持自定义广播,这对于复杂的服务发现场景是一个非常酷的特性,因此现在Foca也支持分发用户数据(请参阅BroadcastHandler文档):-)

  • 它有一个基于流的同步机制(推送-拉取),用于成员间的加入和周期性合并状态:它超出了Foca的职责范围,但这是一个非常有趣的想法,所以我公开了Foca::apply_many方法,使使用Foca的代码能够在需要时执行类似操作。

  • 其配置参数根据(当前)集群大小而变化。用户可以使用 Config::new_{lan,wan} 以及 Foca::set_config 实现相同的功能。

参考文献

许可证

除非明确说明,否则所有作品均受Mozilla公共许可证第2.0版条款的约束。

位于 examples/ 目录内的文件属于公共领域。

依赖项

~0.5–1MB
~17K SLoC