在 Rust 中的确定性模拟测试:状态机的剧场

主要观点:一年前实现了 Go 数据库的确定性模拟测试(DST),现正用 Rust 基于对象存储编写新数据库,本文介绍新 Rust 数据库采用 DST 原则的构建方法及与 FrostDB 方法的比较。

关键信息

  • DST 是随机化全系统集成测试,可重现失败,能提前发现系统复杂错误,提高调试效率,增强系统正确性信心。
  • DST 可归结为控制并发性、时间、随机性和故障注入这四个主要因素,Go 中默认并发模型需控制调度,Rust 中可选择不同方式实现 DST。
  • 新数据库架构为一组状态机,受 sled 模拟指南启发,核心组件为单线程状态机,通过消息总线连接,实现维度缩减,便于推理和测试。
  • 消息总线在确定性模拟测试中成为强大抽象,控制任务调度、时间、随机性和故障注入,各因素控制集中在一处。
  • 状态机架构虽灵活强大,但也有缺点,如增加开发者认知负担,外部依赖会引入不确定性降低 DST 覆盖范围。

重要细节

  • FrostDB 实现 DST 时选择控制现有调度器,虽有效但故障注入有限;Rust 中 madsim 可实现确定性执行和故障注入,但从头写新代码基可更好控制。
  • 状态机通过tickreceive方法实现状态变化和消息传递,tick用于定时器事件,receive处理输入消息产生输出消息。
  • 控制随机性通过使用单个伪随机数生成器,故障注入通过消息总线发送错误实现,只需在一处实现即可应用于所有状态机。
  • 状态机架构虽有缺点,但对于追求确定性正确性的系统是一种更简单强大的方式,作者希望能启发读者在构建中应用 DST。
阅读 15
0 条评论