Ale*_*ian 6 java amazon-ec2 amazon-web-services
我正在使用Java AWS SDK来制作EC2现场实例请求.与on demand实例相反,spot请求的API没有任何类似的东西ClientToken
,因此不支持开箱即用的幂等性.
我能想到的最直接的方法是将LaunchGroup
属性设置为唯一的UUID; 当我检查我打电话DescribeSpotInstanceRequests
,看看我是否已经有同一个发起组的请求.
令我惊讶的是,似乎在描述调用返回之前发送的现场请求之前有一段延迟.我为此编写了一个JUnit测试,似乎为了使它保持一致,我必须在两次调用之间设置至少60s的超时(请求点实例和描述点实例请求).我需要具有10s的粒度,因为我的请求可以在此间隔由应用程序重复,以防出现任何故障 - 即在我发送请求之后但在我能够读取从亚马逊返回的结果之前中断了.在这种情况下,我不想重复请求,我只是想看到它已经注册并继续前进.
@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);
}
Run Code Online (Sandbox Code Playgroud)
如果TIMEOUT设置为60s,则每次测试都有效; 40-50秒它间歇性地工作.每次低于此值的任何事情都会失败.
有没有人设法解决这个延迟?是否仅使用AWS API实现了对点请求的幂等性并且没有在客户端应用程序中保存状态?
在这种情况下,我不想重复请求,我只想看到它已注册并继续。
如果你收到了 200 美元,那么它就被注册了。它可能不会立即显示,但它已注册,您可以继续流程。
是否可以仅使用 AWS API 而无需在客户端应用程序中保存状态来实现现货请求的幂等性?
我不相信是这样。我对亚马逊的 EMR 也有同样的问题。我解决这个问题的方法是让一个组件负责观察集群。当我请求 EMR 集群时,我会返回一个集群 ID,然后将其传递给某个观察者。当该集群改变状态时,观察者将调用我的其他组件。没有立即得到 EMR 确认是一个有效的案例,不会被视为例外。
我不知道这是否适合你。也许您可以尝试维护SpotInstanceRequestId。就我而言,我只将它们保留在内存中,但如果需要,您可以将它们保留在某个持久的地方。
归档时间: |
|
查看次数: |
649 次 |
最近记录: |