4个版本
0.2.0 | 2022年8月10日 |
---|---|
0.2.0-alpha.7 | 2022年8月6日 |
0.2.0-alpha.6 | 2022年8月1日 |
0.2.0-alpha.5 | 2022年7月26日 |
#1688 在 数据库接口
485KB
11K SLoC
MadSim
分布式系统的魔法确定性模拟器。
确定性模拟测试
MadSim是一个类似于tokio的Rust异步运行时,但有一个名为“确定性模拟”的关键特性。
主要思想借鉴自FoundationDB和sled模拟指南。您的代码应该在模拟器上能够确定性执行。模拟器将放大随机性,创造混乱并向系统中注入故障。许多隐藏的缺陷可能会被揭示,然后您可以确定性地重现它们直到修复。如果您的系统能够在这种混乱中生存,您将更有信心将系统部署到现实世界。
然而,实现确定性模拟是困难的。在模拟期间,所有与I/O相关的接口都必须被模拟,并且所有不确定性都应该被消除。这个项目就是为了简化这个过程而创建的。
这个crate的实现部分灵感来源于tokio-rs/simulation。
用法
将以下行添加到您的Cargo.toml中
[dependencies]
madsim = "0.2"
如果您的项目依赖于tokio或tonic,替换以下所有条目
[dependencies]
tokio = { version = "0.2", package = "madsim-tokio" }
tonic = { version = "0.2", package = "madsim-tonic" }
[dev-dependencies]
tonic-build = { version = "0.2", package = "madsim-tonic-build" }
如果您的依赖图包括以下crate,替换它们为我们的补丁版本
[patch.crates-io]
quanta = { git = "https://github.com/madsys-dev/quanta.git", rev = "a819877" }
getrandom = { git = "https://github.com/madsys-dev/getrandom.git", rev = "cc95ee3" }
正常构建时,这些crate与原始版本相同。
要在模拟器上运行您的代码,启用配置madsim
RUSTFLAGS="--cfg madsim" cargo test
现在您已经去掉了tokio/tonic,您已经进入了模拟世界!
我们提供了一套用于控制模拟器的API。您可以使用它们来终止进程、断开网络、注入故障等。查看文档并搜索sim
特性来了解更多用法。
确保确定性
开发人员应该消除应用程序代码中的任何随机性。这并不容易。
以下是一些避免随机性的技巧
为了确保您的代码是确定的,使用以下环境变量运行您的测试
MADSIM_TEST_CHECK_DETERMINISM=1
您的测试将至少运行两次,使用相同的种子。如果检测到任何非确定性,它将立即panic。
相关项目
- MadRaft:由MIT 6.824和PingCAP人才计划派生的Raft一致性算法的实验室。
许可证
Apache许可证2.0
依赖项
~6–19MB
~265K SLoC