亚马逊保证系统正确性的 2 大实践|利用正式和半正式的方法。

亚马逊网络服务 (AWS) 致力于提供客户完全信赖的可靠服务。这需要维护最高的安全性、持久性、完整性和可用性标准,而系统正确性是实现这些优先事项的基石。2015 年 4 月,ACM 通讯上发表了一篇题为“亚马逊网络服务如何使用形式化方法”的文章,重点介绍了确保关键服务正确性的方法,这些服务现已成为 AWS 客户最广泛使用的服务之一。

这种方法的核心是 TLA+ 14 ,这是 Leslie Lamport 开发的一种形式化规范语言。我们在 AWS 使用 TLA+ 的经验表明,在实践中应用形式化方法有两大显著优势。首先,我们可以在开发早期识别并消除细微的 bug——这些 bug 是传统方法(例如测试)无法发现的。其次,我们获得了实施积极性能优化所需的深刻理解和信心,同时保持系统的正确性。

此外,15 年前,AWS 的软件测试实践主要依赖于构建时单元测试(通常针对模拟测试)和有限的部署时集成测试。从那时起,我们显著改进了我们的正确性实践,将正式和半正式方法融入到开发流程中。随着 AWS 的发展,正式方法的价值日益凸显——不仅在于确保正确性,还在于性能提升,尤其是在验证低级和高级优化的正确性方面。这种系统化的系统正确性方法已成为 AWS 规模化发展过程中的倍增器,它通过提高开发人员速度实现了更快的开发周期,同时为客户提供了更具成本效益的服务。

本文概述了 AWS 中使用的各种形式化方法,这些方法旨在以高度可信的正确性交付复杂服务。我们考虑对形式化方法进行一个总体定义,涵盖这些严格的技术——从传统的形式化方法(例如定理证明 7、10 、演绎验证 18 和模型检查 8、14 ) ,到更轻量级的半形式化方法(例如基于属性的测试 6、19、模糊测试 9 和运行时监控 11)。

1

   

P 编程语言

2010 年代初,随着形式化方法的应用范围从 AWS 最初的团队扩展到其他团队,我们发现许多工程师在学习 TLA+ 并提高其效率方面遇到了困难。这种困难似乎源于 TLA+ 的定义性特征:它是一种高级抽象语言,比大多数开发人员熟悉的命令式编程语言更接近数学。虽然这种数学特性是 TLA+ 的一大优势,而且我们仍然认同 Lamport 关于数学思维益处的观点,(参考 15 )但我们也在寻求一种语言,它能够让我们对系统设计的关键方面进行模型检查(并随后进行证明),同时更易于程序员理解。

我们在 P 编程语言中找到了这种平衡。8 P 是一种基于状态机的语言,用于对分布式系统进行建模和分析。使用 P,开发人员将他们的系统设计建模为通信状态机,这是亚马逊开发人员群体所熟悉的思维模型——他们中的大多数人基于微服务和面向服务的架构 (SOA) 开发系统。P 自 2019 年以来一直在 AWS 上开发,并作为战略性开源项目进行维护。22 AWS 的各个团队构建了其一些旗舰产品——从存储(例如 Amazon S3、EBS)到数据库(例如 Amazon DynamoDB、MemoryDB、Aurora)再到计算(例如 EC2、IoT)——他们一直在使用 P 来推断其系统设计的正确性。

例如,在将简单存储服务 (S3) 从最终一致性迁移到强读后写一致性时使用了 P。1 S3 的一个关键组件是其索引子系统,这是一个支持快速数据查找的对象元数据存储。为了实现强一致性,S3 团队必须对 S3 索引协议栈进行一些重要的更改。25 由于这些更改很难在 S3 规模上正确实现,并且团队希望以高度的正确性提供强一致性,因此他们使用 P 对协议设计进行正式建模和验证。P 帮助在开发过程的早期消除了几个设计级错误,并允许团队满怀信心地进行有风险的优化,因为它们可以通过模型检查进行验证。

2023 年,AWS 的 P 团队构建了 PObserve,它提供了一种新工具,用于在测试和生产过程中验证分布式系统的正确性。借助 PObserve,我们从分布式系统的执行过程中获取结构化日志,并事后验证它们是否符合系统正式 P 规范所允许的行为。这可以弥合系统设计的 P 规范与生产实现(通常使用 Rust 或 Java 等语言)之间的差距。虽然在设计时验证协议有显著的优势,但在实现过程中对相同属性进行运行时监控,使得对正式规范的投资更有价值,并解决了在实践中部署正式方法(即将设计时验证与系统实现相连接)的经典问题。

2

   

轻量级形式化方法

AWS 使形式化方法更贴近其工程团队的另一种方式是采用轻量级形式化方法。

基于属性的测试。 利用轻量级形式化方法最值得注意的一个例子是 Amazon S3 的 ShardStore,团队在整个开发周期中使用基于属性的测试来测试正确性并加快开发速度(Bornholt 等人对此进行了详细描述)。他们方法的核心思想是将基于属性的测试与开发人员提供的正确性规范、覆盖引导模糊测试(一种由代码覆盖率指标引导输入分布的方法)、故障注入(在测试期间模拟硬件和其他系统故障)以及最小化(自动减少反例以辅助人工引导调试)相结合。

确定性模拟。AWS 广泛使用的另一种轻量级方法是确定性模拟测试。在这种测试中,分布式系统在单线程模拟器上执行,并控制所有随机性源,例如线程调度、时序和消息传递顺序。然后,针对特定的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Spring_java_gg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值