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

bolic-network

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

1个不稳定版本

0.0.1 2024年3月21日

#49#工具

Apache-2.0

215KB
5K SLoC

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

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

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

为什么不使用Tokio?

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

在不同层次上可重用

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

在最高层次上,人们可以选择使用

  • network(待定):将包含自组织网络的代码,包括节点发现、路由等。
  • hub:定义并实现了一个多传输“枢纽”,可以根据提供的联系人自动连接到其他对等节点。这对于相对静态的网络设置非常有用,例如基于投票(或“基于投票”、“PoS”)的共识协议或MPC项目。

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

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

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

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

可移植性

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

许可证

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

依赖关系

~4–22MB
~400K SLoC