#postgresql #sql #async

madsim-tokio-postgres

原生、异步的PostgreSQL客户端

4个版本

0.2.0 2022年8月10日
0.2.0-alpha.72022年8月6日
0.2.0-alpha.62022年8月1日
0.2.0-alpha.52022年7月26日

#1688数据库接口

MIT/Apache

485KB
11K SLoC

MadSim

Crate Docs CI

分布式系统的魔法确定性模拟器。

确定性模拟测试

MadSim是一个类似于tokio的Rust异步运行时,但有一个名为“确定性模拟”的关键特性。

主要思想借鉴自FoundationDBsled模拟指南。您的代码应该在模拟器上能够确定性执行。模拟器将放大随机性,创造混乱并向系统中注入故障。许多隐藏的缺陷可能会被揭示,然后您可以确定性地重现它们直到修复。如果您的系统能够在这种混乱中生存,您将更有信心将系统部署到现实世界。

然而,实现确定性模拟是困难的。在模拟期间,所有与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