宣布 turmoil

2023年1月3日

今天,我们很高兴地宣布 turmoil 的首次发布,这是一个用于开发和测试分布式系统的框架。

测试分布式系统很困难。非确定性无处不在(网络、时间、线程等),使得难以实现可重现的结果。由于部署,开发周期很长。所有这些因素都减慢了开发速度,并使其难以确保系统的正确性。

turmoil 致力于通过模拟主机、时间和网络来解决这些问题。这允许整个分布式系统在单个进程中的单个线程上运行,从而实现确定性执行。我们还提供对网络的细粒度控制,支持丢弃、保持和延迟主机之间的消息。

开始使用

要使用 turmoil,请将 crate 添加到您的 Cargo.toml 文件中

[dev-dependencies]
turmoil = "0.3"

类似于 loom,我们提供了模拟的网络类型,这些类型镜像了 tokio::net。在您的 crate 中定义一个名为 net 或任何您选择的其他名称的新模块。在此模块中,列出需要在 turmoiltokio::net 之间切换的类型

#[cfg(not(feature = "turmoil"))]
pub use tokio::net::*;

#[cfg(feature = "turmoil")]
pub use turmoil::net::*;

然后,使用来自此本地模块的网络类型编写您的软件。

#[cfg(feature = "turmoil")]
mod simulation {
    #[test]
    fn simulate_it() -> turmoil::Result {
        // build the simulation
        let mut sim = turmoil::Builder::new().build();

        // setup a host
        sim.host("server", || async move {
            // host software goes here
        });

        // setup the test
        sim.client("test", async move {
            // dns lookup for "server"
            let addr = turmoil::lookup("server");

            // test code goes here

            Ok(())
        });

        // run the simulation
        sim.run()
    }
}

每个主机(包括测试代码)都在其自己的 Runtime 上运行,该 Runtime 由模拟管理。在 run() 中,模拟以可配置的持续时间步进每个运行时,直到测试代码完成。

下一步是什么?

这个 crate 仍处于实验阶段。您的用例和反馈对于指导我们的开发非常宝贵。

提交 issue 并在 Discord 的 #turmoil-simulation 中 ping 我们

祝测试愉快!

— Brett McChesney (@mcches)