

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 亚马逊 EC2 API 的最终一致性
<a name="eventual-consistency"></a>

由于支持 Amazon EC2 API 的系统的分布式特性，Amazon API 遵循最终一致性模型。这意味着，您运行的影响您的 Amazon EC2 资源的 API 命令的结果可能不会立即显示给您随后运行的所有命令。在执行紧随上一个 API 命令的 API 命令时，应记住这一点。

最终一致性会影响您管理资源的方式。例如，如果您运行命令创建了某个资源，这个资源最终会对其他命令变得可见。这意味着，如果您立刻运行命令去修改或查询刚创建的资源，由于其 ID 可能尚未在系统中传播完成，您可能会收到资源不存在的错误。

要管理最终一致性，您可以执行以下操作：
+ 在运行修改命令之前，先确认资源的当前状态。使用指数回退算法运行相应的 `Describe` 命令，来确保有足够的时间让前一个命令传播遍整个系统。为此，请重复运行该`Describe`命令，从几秒钟的等待时间开始，然后逐渐增加到几分钟的等待时间。
+ 增加后续命令之间的等待时间，即使 `Describe` 命令返回准确的响应，也是如此。应用指数退避算法，从几秒钟的等待时间开始，然后逐渐增加到几分钟的等待时间。

**最终一致性错误示例**  
以下是一些由于最终一致性而可能遇到的错误代码示例。
+ `InvalidInstanceID.NotFound`

  如果您成功执行了 `RunInstances` 命令，然后立刻使用 `RunInstances` 返回的实例 ID 执行另一个命令，可能会返回 `InvalidInstanceID.NotFound` 错误。这并不代表该实例不存在。

  以下是可能受影响的一些具体命令：
  + `DescribeInstances`：要确认实例的实际状态，请使用指数回退算法运行此命令。
  + `TerminateInstances`：要确认实例状态，请先使用指数回退算法运行 `DescribeInstances` 命令。
**重要**  
如果您在运行 `TerminateInstances` 之后收到 `InvalidInstanceID.NotFound` 错误，这并不代表实例已经或即将被终止。实例仍有可能正在运行。因此，您应当首先使用 `DescribeInstances` 来确认实例状态。
+ `InvalidGroup.NotFound`

  如果您成功执行了 `CreateSecurityGroup` 命令，然后立即使用 `CreateSecurityGroup` 返回的安全组 ID 执行另一个命令，可能会返回 `InvalidGroup.NotFound` 错误。要确认安全组的状态，请使用指数回退算法运行 `DescribeSecurityGroups` 命令。
+ `InstanceLimitExceeded`

  您请求的实例数量超过了当前对指定实例类型的配额上限。如果您在短时间内频繁创建和终止实例，可能会出乎意料地触及此配额限制，因为即使实例已被终止，它们在一段时间内仍会计入您的实例配额。