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

ruserf

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

2 个不稳定版本

0.1.0 2024 年 4 月 15 日
0.0.0 2023 年 5 月 18 日

#462网络编程

MPL-2.0 许可证

685KB
18K SLoC

RuSerf

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's Runtime trait 提供,默认支持 tokioasync-stdsmol。用户可以自己实现 Runtime 并将其连接到 ruserf。

    • 地址解析层

      地址解析层由nodecraft's AddressResolver trait提供支持。

    • 序列化/反序列化层

      默认情况下,Rust的ruserf使用length-prefix encoding (Lpe)来序列化/反序列化消息为字节或相反。Lpe的实现尝试在序列化/反序列化时尽量避免重新分配。

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

    • NetTransport

      NetTransport支持三种不同的内置流层

    • QuicTransport

      QUIC传输是一个实验性的传输实现,它经过良好测试但仍处于实验阶段。

      QuicTransport有两种不同的内置流层

    用户仍然可以实现自己的流层,以适应不同的传输实现。

  • 代理层

    该层用作不同类型消息的反应器。

    • 代理

      如果客户端想要连接到Serf的gossip层,则必须实现代理(Delegate)trait。所有方法都必须是线程安全的,因为它们可能并且通常将并发调用。

      以下是一些子代理(Delegate)trait

      • MergeDelegate

        用于将客户端涉及潜在集群合并操作。也就是说,当一个节点执行承诺的推送/拉取(作为加入的一部分)时,代理被涉及并允许根据自定义逻辑取消加入。合并代理不是作为推送/拉取反熵的一部分调用的。

      • TransformDelegate

        用于编码和解码的代理。用于控制ruserf应该如何编码/解码消息。

      • ReconnectDelegate

        用于自定义重连行为,用户可以实现以允许覆盖单个成员的重连超时。

    • CompositeDelegate

      CompositeDelegate是一个有用的结构体,可以将Delegate分割成多个小代理,这样用户在只想自定义代理中的某些方法时,就不需要实现完整的Delegate

协议

ruserf基于"SWIM: Scalable Weakly-consistent Infection-style Process Group Membership Protocol"。然而,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–34MB
~552K SLoC