6 个版本
0.2.2 | 2024年4月13日 |
---|---|
0.2.1 | 2024年4月13日 |
0.1.5 | 2024年3月27日 |
#1602 在 网络编程
每月 25 次下载
在 2 个包中使用(通过 memberlist)
655KB
16K SLoC

Memberlist
一个高度可定制、适应性强的、运行时无关且 WASM/WASI 友好的 Gossip 协议,有助于管理集群成员和成员故障检测。
将 HashiCorp 的 memberlist 端口和改进到 Rust。
英文 | 简体中文
简介
memberlist 是一个使用基于 Gossip 协议来管理集群成员和成员故障检测的 Rust 包。
此类库的使用场景非常广泛:所有分布式系统都需要成员管理,而 memberlist 是一个可重用解决方案,用于管理集群成员和节点故障检测。
memberlist 最终是一致的,但平均而言收敛速度很快。可以通过协议上的各种旋钮来大幅度调整其收敛速度。通过尝试通过多个路由与可能已死亡节点通信,来检测节点故障和部分容忍网络分区。
memberlist 与 WASM/WASI 兼容,所有包都可以编译为 wasm-wasi
和 wasm-unknown-unknown
(需要配置包功能)。
设计
与原始的 Go 实现不同,Rust 的 memberlist 使用高度通用和分层架构,用户可以轻松实现自己的组件并将其插入 memberlist。用户甚至可以自定义自己的 Id
和 Address
。
以下是层次结构
-
传输层
默认情况下,Rust 的 memberlist 提供两种传输类型 --
QuicTransport
和NetTransport
。-
运行时层
由
agnostic
的Runtime
特性 提供了与异步运行时无关的功能,默认支持tokio
、async-std
和smol
。用户可以自行实现Runtime
并将其插入成员列表。 -
地址解析层
地址解析层由
nodecraft
的AddressResolver
特性支持。 -
序列化/反序列化层
默认情况下,Rust 的 memberlist 使用
length-prefix encoding (Lpe)
来将消息序列化为字节或反序列化,实现Lpe
尽量避免序列化/反序列化时的重新分配。但是,用户可以通过实现
Wire
特性来使用任何其他序列化/反序列化框架。 -
为
NetTransport
提供了三种不同的内置流层。Tcp
:基于 TCP 和 UDPTls
:基于rustls
和 UDPNativeTls
:基于native-tls
和 UDP
-
QUIC 传输是一个实验性的传输实现,它已经过充分测试,但仍处于实验阶段。
为
QuicTransport
提供了两种不同的内置流层。
用户仍然可以为自己的传输实现实现自己的流层。
-
-
代理层
此层用作不同类型消息的触发器。
-
代理
如果客户端想连接到 Memberlist 的八卦层,则必须实现
Delegate
特性。所有方法都必须是线程安全的,因为它们可能并且通常会被并发调用。以下是一些子代理特性
-
AliveDelegate
用于将客户端涉及处理一个节点的 "活跃" 消息。当一个节点通过数据包八卦或承诺推送/拉取加入时,我们通过活跃消息更新该节点的状态。这可以用于通过特定于应用程序的逻辑过滤节点并阻止它被考虑为对等节点。
-
ConflictDelegate
用于通知客户端一个节点已尝试加入,这将导致名称冲突。如果两个客户端配置了相同的名称但不同的地址,则会出现这种情况。
-
EventDelegate
这是一个较简单的代理,仅用于接收有关成员加入和离开的通知。此代理中的方法可能由多个线程调用,但永远不会并发调用。这允许你考虑顺序。
-
MergeDelegate
用于将客户端涉及潜在的集群合并操作。也就是说,当一个节点执行承诺推送/拉取(作为加入的一部分)时,代理被涉及并允许根据自定义逻辑取消加入。合并代理不是作为推送/拉取反熵的一部分调用的。
-
NodeDelegate
用于管理节点相关事件。例如:元数据
-
PingDelegate
用于通知观察者ping消息往返所需的时间。它还可以用于将任意字节切片写入ack消息。请注意,为了使RTT估计有意义,此委托不适用于间接ping,也不适用于通过承诺连接发送的备用ping。
-
-
CompositeDelegate
CompositeDelegate是一个有用的结构,可以将
Delegate
拆分成多个小的委托,这样用户在只想自定义Delegate中的一些方法时,无需实现完整的Delegate
。
-
协议
memberlist基于"SWIM: 可扩展的弱一致性感染式进程组成员资格协议"。然而,Hashicorp开发者以多种方式扩展了该协议
进行了一些扩展,以提高传播速度和收敛速度。另一组扩展,Hashicorp开发者称之为Lifeguard,是为了使memberlist在存在缓慢的消息处理(由于CPU饥饿、网络延迟或丢失等因素)的情况下更加健壮。有关所有这些扩展的详细信息,请参阅Hashicorp的论文"Lifeguard : SWIM-ing with Situational Awareness",以及memberlist源代码。
安装
[dependencies]
memberlist = "0.1"
问答
-
Rust的memberlist实现与Go的memberlist兼容吗?
不兼容,但也兼容!默认情况下,它们不兼容。但关键在于序列化/反序列化层,Go的memberlist使用msgpack作为序列化/反序列化框架,所以从理论上讲,如果您可以实现一个兼容Go的memberlist的
Wire
trait,那么它们就兼容了。 -
如果Go的memberlist添加更多功能,此项目也会支持吗?
是的!此项目可能还会添加Go的memberlist没有的功能。例如:wasmer支持、绑定到其他语言等。
相关项目
agnostic
:帮助您开发运行时无关的cratenodecraft
:为分布式系统提供无缝节点操作的crafting,提供节点标识和地址解析的基础特质。transformable
:在结构化和字节形式之间转换其表示。peekable
:可查看的读取器和异步读取器
许可证
memberlist
受MPL-2.0许可证条款约束。
有关详细信息,请参阅LICENSE。
版权(c)2024 刘磊。
版权(c)2013 HashiCorp,Inc。
依赖项
~13–30MB
~467K SLoC