6

我正在使用 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 而不在客户端应用程序中保存状态来实现点请求的幂等性?

4

1 回答 1

0

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

如果你有一个 200 回来,那么它已经注册。它可能不会立即显示,但它已注册,您可以继续您的流程。

是否可以仅使用 AWS API 而不在客户端应用程序中保存状态来实现点请求的幂等性?

我不相信。我对亚马逊的 EMR 也有同样的问题。我解决它的方法是让一个组件负责观察集群。当我请求 EMR 集群时,我会返回一个集群 ID,然后将其传递给某个观察者。然后,当该集群更改状态时,观察者将调用我的其他组件。没有立即被 EMR 确认是一个有效的案例,不被视为例外。

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

于 2013-12-23T21:50:31.397 回答