#lock-free #distributed-systems #lease #unit-testing #leases #fence-token

steelmill

为分布式系统和模拟测试设计的资源管理器(依赖注入/工厂)

2 个版本

0.0.2 2024年4月26日
0.0.1 2023年12月18日

#681 in 并发

每月 33 次下载

MIT 许可证

40KB
615 代码行

steelmill

这个库使得在单个 Rust 进程中管理多个长时间运行的服务(称为 Daemon)变得容易。它针对异步、多线程运行时,并且是无锁的。

Daemons 由一系列 Factory 对象管理。当合适时,工厂使用其父级的 Daemon 实例,从而允许它们共享状态。创建子工厂的主要有两个原因:

  • 在测试分布式系统时,您可以使用父工厂来实现回环网络,并提供创建系统所需的任何集群配置状态。然后,每个子 Factory 管理 Daemons,尽管整个设置都在单个操作系统进程中运行,但它们在逻辑上运行在不同的机器上。
  • 在处理进程中的复杂生命周期时,您可以使用子工厂的寿命与特定于应用程序的概念相匹配。例如,子工厂对象可以对应于租约,在租约获得/丢失时实例化/拆除,或者您可以使用子工厂来管理可以动态安装或从程序中删除的插件。

除了基本库之外,此包还包含单元测试的辅助工具和一个示例应用程序,该应用程序允许您通过传递命令行参数来选择要实例化的 Daemons

异步 Rust 代码的无成本模拟测试比我们希望的更具挑战性。一方面,我们希望能够模拟性能关键的数据路径 API,这意味着它们应通过某种类型的接口调用。另一方面,截至本文撰写时,Rust 不支持异步特质,而工作区(如 async_trait 包)为每个异步函数调用添加了内存分配!

作为替代方案,我们目前建议应用程序使用 cargo 功能标志来编译应用程序以供运行时使用,或用于模拟测试。使用条件编译来提供互斥功能违反了 cargo 的设计,因此我们必须做一些奇怪的事情来使其按预期工作。示例应用程序显示了如何操作,但我们希望异步特质稳定后切换到不同的方法。

依赖项

~7–18MB
~224K SLoC