#service-discovery #memberlist #gossip #swim #fault-tolerant #serf #wasi

ruserf-core

一种轻量级、高可用和容错的服务发现和编排的分布式解决方案

1 个不稳定版本

0.1.0 2024 年 4 月 15 日

#3#serf


被用于 ruserf

MPL-2.0 许可证

630KB
17K SLoC

RuSerf

一种高度可定制、适应性强、运行时无关且对 WASM/WASI 友好的轻量级、高可用和容错的分布式解决方案,用于服务发现和编排。

将 HashiCorp 的 serf 移植并改进到 Rust。

github LoC Build codecov

docs.rs crates.io crates.io license

英文 | 简体中文

简介

ruserf 是一种轻量级、高可用和容错的服务发现和编排的分布式解决方案。

此类库的应用范围很广:所有分布式系统都需要成员资格,ruserf 是管理集群成员资格和节点故障检测的可重用解决方案。

ruserf 最终是一致的,但平均而言收敛得很快。通过协议的各种旋钮可以大量调整其收敛速度。通过尝试通过多个路由与可能已死节点通信,来检测节点故障和部分容忍网络分区。

ruserf 对 WASM/WASI 友好,所有 crate 都可以编译为 wasm-wasiwasm-unknown-unknown(需要配置 crate 功能)。

设计

与原始的 Go 实现 不同,Rust 的 ruserf 使用高度通用和分层架构,用户可以轻松地自行实现一个组件并将其插入到 ruserf 中。用户甚至可以自定义自己的 IdAddress

以下是这些层:

  • 传输层

    默认情况下,Rust 的 ruserf 提供两种类型的传输 -- QuicTransportNetTransport

    • 运行时层

      agnostic'的Runtime特质提供异步运行时,默认支持tokioasync-stdsmol。用户可以自己实现Runtime并将其插入到ruserf中。

    • 地址解析层

      地址解析层由nodecraft'的AddressResolver特质支持。

    • 序列化/反序列化层

      默认情况下,Rust的ruserf使用length-prefix encoding (Lpe)来序列化/反序列化消息到字节或相反。Lpe的实现试图在序列化/反序列化过程中尽可能地避免重新分配。

      但用户可以通过实现Wire特质来使用任何其他序列化/反序列化框架。

    • NetTransport

      NetTransport提供了三种不同的内置流层。

    • QuicTransport

      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:帮助您开发对运行时无感知的 crate
  • nodecraft:为分布式系统提供无缝节点操作,提供节点识别和地址解析的基础特性。
  • transformable:在结构化和字节形式之间转换其表示。
  • peekable:可窥视的读取器和异步读取器
  • memberlist:一个高度可定制、可适应、对运行时无感知且 WASM/WASI 友好的 Gossip 协议,有助于管理集群成员和成员故障检测。

许可证

ruserf受 MPL-2.0 许可证的约束。

有关详细信息,请参阅LICENSE

版权 (c) 2024 Al Liu。

版权 (c) 2013 HashiCorp, Inc。

依赖项

~16–32MB
~512K SLoC