# How NASA built Artemis II’s fault-tolerant computer

> 来源：[HackerNews](https://cacm.acm.org/news/how-nasa-built-artemis-iis-fault-tolerant-computer/)

# How NASA 为 Artemis II 打造了容错计算机：从太空探索到软件工程的启示

## 背景与概述

当人类的目光再次投向月球，NASA 的阿尔忒弥斯计划（Artemis Program）正承载着半个多世纪后的重返梦想。作为该计划的关键一步，Artemis II 任务将首次搭载宇航员进行绕月飞行，为后续的月球着陆铺平道路。与无人任务不同，载人飞行对系统的**可靠性与安全性**提出了近乎苛刻的要求。在深邃、充满辐射且无法实时维修的太空环境中，任何一个微小的电子故障都可能导致灾难性后果。

因此，为 Artemis II 飞船（猎户座乘员舱）打造一颗强大的“大脑”——一台能够容忍硬件故障并持续正确运行的计算机系统，成为了工程师们面临的核心挑战之一。这不仅仅是航天工程的课题，其背后**容错计算**的设计哲学与实现技术，对地面上面向高可用、高可靠场景的软件开发，如金融交易系统、自动驾驶、工业控制等领域，同样具有深刻的借鉴意义。本文将深入解析 NASA 如何构建这套精密的容错系统，并探讨其背后的通用工程智慧。

## 核心内容

Artemis II 的容错计算机设计并非凭空创造，它根植于航天领域数十年的积累，并针对新任务进行了迭代与创新。其核心思想可以概括为：**通过冗余与管理，将不可靠的物理组件构建成可靠的逻辑系统**。

1.  **多层次冗余架构**：系统并非依赖单一的超高可靠性硬件，而是采用了全面的冗余设计。这包括：
    *   **硬件冗余**：关键的计算模块、电源、数据总线甚至传感器都有多套备份。
    *   **软件冗余**：关键的控制算法和飞行软件会在不同的冗余硬件上并行运行或交叉校验。
    *   **时间冗余**：对于关键操作，系统可能会在时间上重复执行并比对结果，以排除瞬时故障的影响。

2.  **故障检测与隔离**：光有备份不够，必须能快速、准确地发现故障。系统内置了广泛的**健康监控机制**，持续检查处理器状态、内存完整性、总线通信质量等。一旦检测到异常，不是立即“panic”，而是首先尝试定位故障源，并将其与系统的健康部分**隔离**，防止故障扩散（即“故障遏制”）。

3.  **无缝切换与重构**：检测并隔离故障后，系统需要能够**平滑地接管工作**。备份单元应能在极短时间内（通常是毫秒级）激活并同步状态，接替故障单元的功能，确保航天器控��不中断、数据不丢失。这个过程对上层应用和宇航员而言应该是透明的。

4.  **辐射硬化与设计**：太空中的高能粒子（宇宙射线、太阳风）可能穿透飞船，导致半导体器件发生单粒子翻转（SEU）或锁定（SEL）等效应。Artemis II 的计算机采用了经过特殊工艺处理的**抗辐射（Rad-Hard）或耐辐射（Rad-Tolerant）芯片**，同时在电路和系统层面（如纠错码内存、看门狗定时器）设计了缓解措施。

5.  **确定性与实时性**：航天控制是硬实时任务。计算机系统必须在严格规定的时间窗口内完成计算和响应。容错管理逻辑本身也必须具备确定性和可预测性，不能因为进行故障处理而引入不可控的延迟或行为。

## 技术分析

从技术实现角度看，Artemis II 的计算机系统可以被视为一个**分布式容错实时系统**。其架构很可能基于经典的 **N模冗余（N-Modular Redundancy, NMR）** 和 **同步/异步共识算法** 的思想。

一个简化的三模冗余（TMR）模型可以这样理解：三个相同的处理器执行相同的任务，它们的输出被送入一个“表决器”（Voter）。表决器采用“多数决”原则，如果其中一个处理器因故障产生错误输出，其他两个正确的输出将覆盖它，系统对外呈现的仍是正确结果。

```c
// 一个极度简化的 TMR 表决逻辑概念示例
typedef struct {
    int data;
    bool valid;
} ProcessorOutput;

ProcessorOutput proc_a, proc_b, proc_c;

// 假设三个处理器并行计算，结果存入 proc_a, b, c
run_parallel_tasks(&proc_a, &proc_b, &proc_c);

// 表决逻辑
int final_output = -1;
if (proc_a.valid && proc_b.valid && proc_a.data == proc_b.data) {
    final_output = proc_a.data;
} else if (proc_a.valid && proc_c.valid && proc_a.data == proc_c.data) {
    final_output = proc_a.data;
} else if (proc_b.valid && proc_c.valid && proc_b.data == proc_c.data) {
    final_output = proc_b.data;
} else {
    // 无法达成多数一致，触发更高级别的故障处理
    trigger_graceful_degradation_or_safe_mode();
}
```

在实际的航天系统中，表决和同步机制远比上述代码复杂。它们可能运行在**锁步（Lockstep）** 的处理器上，确保指令级同步，或者采用更灵活的**松散同步**配合中间件进行状态比对。系统管理软件（如核心飞行软件）负责协调这些冗余单元，管理配置、监控健康状态、执行切换指令。

此外，**交叉数据校验**和**心跳机制**是常用的故障检测手段。各个模块间定期交换“我还活着”的信号和关键数据校验和，一旦信号超时或校验失败，即怀疑对方或自身出现故障，启动诊断流程。

## 实践建议

虽然大多数开发者不会直接设计航天计算机，但其中的容错设计原则可以降维应用到关键业务系统中：

1.  **设计时考虑故障**：将“故障是常态，而非异常”作为设计前提。进行**故障模式与影响分析（FMEA）**，思考每个组件可能如何失效，以及失效后系统应如何应对。
2.  **实现优雅降级**：并非所有故障都需要全系统崩溃。定义清晰的**降级模式**。例如，一个电商应用在支付网关故障时，可以降级到“仅浏览购物车”模式，而不是直接显示500错误。
3.  **冗余与无状态化**：对于核心服务，部署多个实例（冗余），并尽可能使服务**无状态化**。状态外置到共享存储（如数据库、Redis），这样任何实例故障都可以被快速替换。
4.  **健康检查与熔断**：为每个服务实现深度的**健康检查接口**。使用熔断器模式（如 Hystrix、Resilience4j），当依赖服务故障率达到阈值时，自动快速失败，避免级联雪崩。
5.  **混沌工程实践**：主动在可控环境中注入故障（如随机杀死进程、模拟网络延迟、填满磁盘），持续验证系统的容错能力和应急预案的有效性。Netflix 的 Chaos Monkey 是这一理念的典范。
6.  **日志、监控与可观测性**：建立完善的日志记录、指标监控和分布式追踪体系。当故障发生时，丰富的可观测性数据是快速定位和恢复的基石。

## 总结

NASA 为 Artemis II 打造的容错计算机，是人类工程智慧在极端环境下的集中体现。它向我们展示了，通过严谨的架构设计、冗余策略和智能的故障管理，可以从本质上不可靠的物理基础上，构建出值得托付生命与使命的可靠系统。这套方法论的价值早已超越航天领域，成为构建一切高可用、高可靠数字基础设施的通用语言。对于广大开发者而言，理解其背后的思想，远比复现其具体技术更重要——它提醒我们，在追求功能与性能的同时，永远不要忽视系统在逆境中“活下去”并“保持正确”的能力。这，正是可靠软件工程的精髓所在。