1 个不稳定版本
0.1.0 | 2024 年 4 月 15 日 |
---|
#3 在 #serf
被用于 ruserf
630KB
17K SLoC
RuSerf
一种高度可定制、适应性强、运行时无关且对 WASM/WASI 友好的轻量级、高可用和容错的分布式解决方案,用于服务发现和编排。
将 HashiCorp 的 serf 移植并改进到 Rust。
英文 | 简体中文
简介
ruserf 是一种轻量级、高可用和容错的服务发现和编排的分布式解决方案。
此类库的应用范围很广:所有分布式系统都需要成员资格,ruserf 是管理集群成员资格和节点故障检测的可重用解决方案。
ruserf 最终是一致的,但平均而言收敛得很快。通过协议的各种旋钮可以大量调整其收敛速度。通过尝试通过多个路由与可能已死节点通信,来检测节点故障和部分容忍网络分区。
ruserf 对 WASM/WASI 友好,所有 crate 都可以编译为 wasm-wasi
和 wasm-unknown-unknown
(需要配置 crate 功能)。
设计
与原始的 Go 实现 不同,Rust 的 ruserf 使用高度通用和分层架构,用户可以轻松地自行实现一个组件并将其插入到 ruserf 中。用户甚至可以自定义自己的 Id
和 Address
。
以下是这些层:
-
传输层
默认情况下,Rust 的 ruserf 提供两种类型的传输 --
QuicTransport
和NetTransport
。-
运行时层
由
agnostic
'的Runtime特质提供异步运行时,默认支持tokio
、async-std
和smol
。用户可以自己实现Runtime
并将其插入到ruserf中。 -
地址解析层
地址解析层由
nodecraft
'的AddressResolver特质支持。 -
序列化/反序列化层
默认情况下,Rust的ruserf使用
length-prefix encoding (Lpe)
来序列化/反序列化消息到字节或相反。Lpe的实现试图在序列化/反序列化过程中尽可能地避免重新分配。但用户可以通过实现
Wire
特质来使用任何其他序列化/反序列化框架。 -
NetTransport
提供了三种不同的内置流层。Tcp
:基于TCP和UDPTls
:基于rustls
和UDPNativeTls
:基于native-tls
和UDP
-
QUIC传输是一个实验性的传输实现,经过充分测试但仍然处于实验阶段。
QuicTransport
提供了两种不同的内置流层。
用户仍然可以为不同的传输实现实现自己的流层。
-
-
代理层
此层用作不同类型消息的reactor。
-
代理
如果客户端想连接到Serf的gossip层,则必须实现代理特质。所有方法都必须是线程安全的,因为它们可能并且通常会被并发调用。
以下是子代理特质
-
MergeDelegate
用于让客户端参与潜在的集群合并操作。具体来说,当一个节点执行承诺的推送/拉取(作为加入的一部分)时,代理被涉及,并允许根据自定义逻辑取消加入。合并代理不是作为推送/拉取反熵的一部分被调用的。
-
TransformDelegate
用于编码和解码的代理。用于控制
ruserf
应该如何编码/解码消息。 -
ReconnectDelegate
用于自定义重连行为,用户可以实施以允许为单个成员覆盖重连超时。
-
-
CompositeDelegate
CompositeDelegate是一个有用的结构,可以将
Delegate
拆分为多个小的代理,这样用户就不需要在只想自定义Delegate中的某些方法时实现完整的Delegate
。
-
协议
ruserf基于"SWIM: 可扩展的弱一致性感染式进程组成员资格协议"。然而,Hashicorp开发者在多个方面扩展了该协议。
为了提高传播速度和收敛速度,进行了一些扩展。另一组扩展,HashiCorp 开发者称之为 Lifeguard,旨在使 ruserf 在消息处理缓慢的情况下更加健壮(由于 CPU 饥饿、网络延迟或丢失等因素)。有关所有这些扩展的详细信息,请阅读 HashiCorp 的论文"Lifeguard : SWIM-ing with Situational Awareness",以及 ruserf 源代码。
安装
[dependencies]
ruserf = "0.1"
常见问题解答
-
Rust 的 ruserf 实现是否与 Go 的 serf 兼容?
不兼容,但也不是!默认情况下,它们不兼容。但关键是序列化/反序列化层,Go 的 serf 使用 msgpack 作为序列化/反序列化框架,因此,在理论上,如果您可以实现一个与 Go 的 serf 兼容的
TransformDelegate
特性,那么它们就兼容了。 -
如果 Go 的 serf 添加了更多功能,本项目也会支持吗?
是的!本项目可能还会添加更多 Go 的 serf 没有的功能。例如,wasmer 支持、与其他语言的绑定等。
相关项目
agnostic
:帮助您开发对运行时无感知的 cratenodecraft
:为分布式系统提供无缝节点操作,提供节点识别和地址解析的基础特性。transformable
:在结构化和字节形式之间转换其表示。peekable
:可窥视的读取器和异步读取器memberlist
:一个高度可定制、可适应、对运行时无感知且 WASM/WASI 友好的 Gossip 协议,有助于管理集群成员和成员故障检测。
许可证
ruserf
受 MPL-2.0 许可证的约束。
有关详细信息,请参阅LICENSE。
版权 (c) 2024 Al Liu。
版权 (c) 2013 HashiCorp, Inc。
依赖项
~16–32MB
~512K SLoC