本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
亚马逊 EC2 API 的最终一致性
由于支持 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您请求的实例数量超过了当前对指定实例类型的配额上限。如果您在短时间内频繁创建和终止实例,可能会出乎意料地触及此配额限制,因为即使实例已被终止,它们在一段时间内仍会计入您的实例配额。