实施AWS竞价型实例请求的幂等性

时间:2013-02-06 17:13:32

标签: java amazon-web-services amazon-ec2

我使用Java AWS SDK制作EC2现场实例请求。与按需实例相反,API for spot requestsClientToken没有任何相似之处,因此不支持开箱即用的幂等性。

我能想到的最直接的方法是将LaunchGroup属性设置为唯一的UUID;当我检查时,我拨打DescribeSpotInstanceRequests,看看我是否已经有同一个发起组的请求。

令我惊讶的是,似乎在描述调用返回之前发送的现场请求之前有一段延迟。我为此编写了一个JUnit测试,似乎为了使它保持一致,我必须在两次调用之间设置至少60s的超时(请求点实例和描述点实例请求)。我需要具有10s的粒度,因为我的请求可以在此间隔由应用程序重复,以防出现任何故障 - 即在我发送请求之后但在我读取从Amazon返回的结果之前发生了中断。在那种情况下,我不想重复请求,我只是想看到它已经注册并继续前进。

@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实现了对点请求的幂等性,而没有在客户端应用程序中保存状态?

1 个答案:

答案 0 :(得分:0)

  

在这种情况下,我不想重复请求,我只想看到它已经注册并继续前进。

如果你有200回,那么它已经注册了。它可能不会立即出现,但它已经注册,你可以继续前进。

  

是否仅使用AWS API实现了对点请求的幂等性并且没有在客户端应用程序中保存状态?

我不相信。我和亚马逊的EMR有同样的问题。我解决这个问题的方法是让一个组件的工作就是观察集群。当我发出一个EMR集群的请求时,我得到一个集群ID,然后我将其传递给某个观察者。然后,当该群集改变状态时,观察者将调用我的其他组件。不立即被EMR承认是一个有效的案例,并不被视为例外。

我不知道这是否适合你。也许您可以尝试维护SpotInstanceRequestId。在我的情况下,我只将它们保存在内存中,但如果需要,你可以将它们保存在某个地方。