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 在 网络编程
每月 2,823 次下载
在 3 crate 中使用
275KB
5K SLoC
Foca:按您的需求进行集群成员发现
Foca 是基于 Gossip 的集群发现的基础组件。它是一个小型 no_std
+ alloc
crate,实现了 SWIM 协议及其有用的扩展(SWIM+Inf.+Susp.
)。
项目
- Git 仓库:https://caio.co/de/foca/
- 问题跟踪器:https://github.com/caio/foca/issues
- 持续集成:https://github.com/caio/foca/actions/workflows/ci.yml
- 包:https://crates.io/crates/foca
- 文档:https://docs.rs/foca
简介
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::Identity
对std::net::SocketAddr*
的支持,并暴露了Config::new_lan
和Config::new_wan
。tracing
:使用tracing crate对Foca进行仪器化。高级协议交互作为DEBUG
跟踪发出,更多详细信息可以通过TRACE
级别暴露。不会发出其他级别。serde
:为Foca的公共类型推导出Serialize
和Deserialize
。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
实现相同的功能。
参考文献
- 论文 SWIM: 可扩展的弱一致性感染式进程组成员协议
- HashiCorp的 memberlist
许可证
除非明确说明,否则所有作品均受Mozilla公共许可证第2.0版条款的约束。
位于 examples/
目录内的文件属于公共领域。
依赖项
~0.5–1MB
~17K SLoC