本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
一致性级别
Amazon Cloud Directory 是分布式目录存储。数据分布到不同可用区中的多个服务器。成功的写入请求会更新所有服务器上的数据。数据最终在所有服务器上可用 (通常在一秒内)。为了帮助用户使用服务,Cloud Directory 为读取操作提供了两个一致性级别。本部分介绍 Cloud Directory 的不同一致性级别和最终一致性质。
读取隔离级别
从 Cloud Directory 读取数据时,必须指定要从中进行读取的隔离级别。不同隔离级别在延迟与数据新鲜度之间进行权衡。
-
最终— 快照隔离级别读取立即可用的任何数据。它提供任何隔离级别的最低延迟。 它还提供目录中数据的可能较旧视图。EVENTUAL 隔离不提供先写后读一致性。这意味着不保证在写入数据之后立即能够读取数据。
-
可序列化— 可序列化隔离级别提供 Cloud Directory 所提供的最高一致性级别。在 SERIALIZABLE 隔离级别进行的读取可确保从任何成功写入接收数据。如果对请求的数据以及更改尚不可用的数据进行了更改,则系统使用
RetryableConflictException
拒绝请求。我们建议重试这些异常 (请参阅以下部分)。成功重试时,SERIALIZABLE 读取可提供先写后读一致性。
写入请求
Cloud Directory 可确保多个写入请求不会同时更新相同对象。如果发现在对相同对象执行两个写入请求,则其中一个操作会失败,并出现 RetryableConflictException
x。我们建议重试这些异常 (请参阅以下部分)。
注意
在写入操作期间收到的 RetryableConflictException
响应无法用于检测争用条件。对于被证明存在这种情况的使用案例,不保证始终会发生异常。是否发生异常取决于在内部处理每个请求的顺序。
RetryableConflictExceptions
在对相同对象执行写入之后使用 SERIAVE 隔离级别执行写入操作或读取操作时,Cloud Directory 使用进行响应。RetryableConflictException
。此异常指示 Cloud Directory 服务器尚未处理前一次写入的内容。这些情况是临时的,会快速地自行补救。请务必注意,RetryableConflictException
不能用于检测任何类型的先写后读一致性。并非特定使用案例才会导致此异常。
我们建议配置 Cloud Directory 客户端以重试RetryableConflictException
。此配置可在操作过程中提供无错误的行为。以下示例代码演示如何在 Java 中进行此配置。
RetryPolicy retryPolicy = new RetryPolicy(new CloudDirectoryRetryCondition(), PredefinedRetryPolicies.DEFAULT_BACKOFF_STRATEGY, PredefinedRetryPolicies.DEFAULT_MAX_ERROR_RETRY, true); ClientConfiguration clientConfiguration = new ClientConfiguration().withRetryPolicy(retryPolicy); AmazonCloudDirectory client = new AmazonCloudDirectory ( new BasicAWSCredentials(…), clientConfiguration); public static class CloudDirectoryRetryCondition extends SDKDefaultRetryCondition { @Override public boolean shouldRetry(AmazonWebServiceRequest originalRequest, AmazonClientException exception, int retriesAttempted) { if (exception.getCause() instanceof RetryableConflictException) { return true; } return super.shouldRetry(originalRequest, exception, retriesAttempted); } }