#分布式系统 #抽象 #工具 #构建 #现代 #不同 #网络

lyquor-network

现代网络抽象和工具,用于构建分布式系统

1 个不稳定版本

0.0.1 2024年6月12日

#49#工具

Apache-2.0

215KB
5K SLoC

lyquor-network:用于构建分布式系统的现代网络抽象和工具。

为什么不使用libp2p?(以及其他)

我们相信我们的设计简洁、极简,并且在不同级别上都易于使用。它能够完成像libp2p这样的库所能完成的事情,但基于作者在分布式系统和共识方面的多年前沿研究经验,它具有更好的抽象。它不仅仅是一个“能工作”的代码库,还满足了对网络基础设施广泛需求的满足,特别是那些需要大量二进制(短或中等的)消息的。实际上,我们构建这个库是为了可以被重用,并且能够很好地作为任何以网络方式交换消息的核心基础设施的基础。

为什么不使用Tokio?

我们在代码中确实使用了tokio来管理一些相互交织的异步逻辑,但我们的核心数据传输是通过一个精心设计的、直接基于mio的引擎完成的。我们不是将所有连接都投入tokio,而是通过提供更好的抽象(Endpoint)并通过我们精心设计的Driver(它是一组Worker的池)来驱动它们,从而在以下三个方面建立了良好的分离:网络库中点对点数据传输通道的概念、它所使用的实际底层传输协议(如果实现了Transport特质,甚至可以是短信),以及由传输引起的异步I/O的执行逻辑。从过去的项目中学习,并得益于Rust,我们相信我们的抽象在清晰、简单和低开销的同时实现了。如果不是在绝对性能方面最好(人们总是可以手工制作一个超级临时的解决方案,比如在C中,以达到最优性能),它仍然为具有出色性能和鲁棒性的任何分布式系统提供了一个坚实的基础。

在多个级别上可重用

我们的设计故意将我们的抽象/实现划分为不同的级别,以便工程师和研究人员可以很容易地根据自己的目的使用它们,同时具有很大的定制自由度。

在最高级别,你可以使用以下之一

  • network(待定):将包含自组织网络的代码,包括节点发现、路由等。
  • hub:定义和实现一个多传输“中心节点”,可以自动连接到其他具有联系信息的对等方。这可以用于相对静态的网络设置,如基于投票(或“基于投票”、“PoS”)的共识协议,或MPC项目。

hub中,有三个重要的抽象(及其实现)可以自定义

  • 驱动程序:一组 工作进程,其中每个工作进程都有一个操作系统级别的线程,并驱动多个端点的I/O操作。

  • 端点:一个用户友好的、双向的虚拟通道,用于向某个远程接收者传输数据。端点在其核心处有一个可插拔的 传输,实际上负责实现网络传输。

  • 传输:遵循统一接口的特定协议实现,用于通过端点传输数据。这个抽象的存在使得 端点 可以不关心连接:底层的传输方法可以是“基于连接的”(如TCP)或“无连接的”(如UDP),但端点用户无需担心这一点。端点可以在数据传输“拥堵”(即重新连接)时 更新 其底层传输,以便能够恢复数据传输——所有这些,对端点用户来说都是透明的。更重要的是,在执行所有这些操作的同时,端点可以在工作进程之间(为了负载均衡目的)动态移动,而不会丢失任何数据。

可移植性

我们代码库的大部分内容也兼容WASM。这意味着可以将网络浏览器和类似网络的环境(如移动应用)转换为合法的节点,与其他节点进行通信。这意味着可以在客户端运行轻量级节点以与“服务器”(具有有用服务的节点)进行通信,而不需要调用繁琐的RPC协议,如JSON/RPC或Web REST调用,从而实现“真正的”P2P。

许可证

本项目采用Apache License 2.0许可。有关更多信息,请参阅NOTICE文件。

依赖项

~4–22MB
~394K SLoC