我正在使用 Java AWS SDK 发出 EC2 现货实例请求。与按需实例相反,Spot 请求的 API没有任何类似的东西ClientToken
,因此不支持开箱即用的幂等性。
我能想到的最直接的方法是将LaunchGroup
属性设置为唯一的 UUID;当我检查时,我打电话DescribeSpotInstanceRequests
,看看我是否已经有同一个启动组的请求。
令我惊讶的是,在描述调用返回之前发送的现场请求之前似乎存在延迟。我为此编写了一个 JUnit 测试,似乎为了使其保持一致,我必须在两次调用之间设置至少 60 秒的超时时间(请求现场实例和描述现场实例请求)。我需要有 10 秒的粒度,因为我的请求可以在此时间间隔内被应用程序重复,以防出现任何故障 - 即在我发送请求后但在我读取从亚马逊返回的结果之前出现了中断。在这种情况下,我不想重复请求,我只想看到它已注册并继续前进。
@Test
public void testRunSpotInstances() throws Exception {
activity.execute(execution);
timeout(TIMEOUT);
// shouldn't do anything
activity.execute(execution);
timeout(TIMEOUT);
DescribeSpotInstanceRequestsResult result = client.describeSpotInstanceRequests(
new DescribeSpotInstanceRequestsRequest().withFilters(new Filter()
.withName("launch-group").withValues(BUSINESS_KEY)));
assertThat(result.getSpotInstanceRequests()).hasSize(1);
timeout(TIMEOUT);
}
如果TIMEOUT设置为60s,则每次测试都有效;对于 40-50 秒,它会间歇性地工作。低于此的任何东西每次都会失败。
有没有人设法解决这个延迟?是否可以仅使用 AWS API 而不在客户端应用程序中保存状态来实现点请求的幂等性?