Java 实现AWS Spot实例请求的幂等性

Java 实现AWS Spot实例请求的幂等性,java,amazon-web-services,amazon-ec2,Java,Amazon Web Services,Amazon Ec2,我正在使用JavaAWSSDK发出EC2SPOT实例请求。与随需应变实例相反,没有类似的内容,因此不支持开箱即用的幂等性 我能想到的最简单的方法是将LaunchGroup属性设置为唯一的UUID;当我检查时,我会打电话,看看我是否已经收到了同一个启动组的请求 令我惊讶的是,在descripe调用返回之前发送的spot请求之前,似乎有一个延迟。我为此编写了一个JUnit测试,似乎为了使它保持一致,我必须在两个调用之间设置至少60秒的超时(request spot instance和Descript

我正在使用JavaAWSSDK发出EC2SPOT实例请求。与随需应变实例相反,没有类似的内容,因此不支持开箱即用的幂等性

我能想到的最简单的方法是将
LaunchGroup
属性设置为唯一的UUID;当我检查时,我会打电话,看看我是否已经收到了同一个启动组的请求

令我惊讶的是,在descripe调用返回之前发送的spot请求之前,似乎有一个延迟。我为此编写了一个JUnit测试,似乎为了使它保持一致,我必须在两个调用之间设置至少60秒的超时(request spot instance和Descripte spot instance请求)。我需要有一个10秒的粒度,因为我的请求可以在这个时间间隔内被应用程序重复,以防任何失败-即,在我发送请求后,但在我能够读取从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);
}
如果超时设置为60秒,则每次测试都有效;对于40-50秒,它间歇性工作。任何低于此值的操作都会失败

有人设法解决了这一延误吗?仅使用AWS API而不在客户端应用程序中保存状态是否可以实现spot请求的幂等性

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

@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);
}
如果你有一个200,那么它是注册的。它可能不会立即显示,但它已注册,您可以在流程中继续

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

我不这么认为。我对亚马逊的电子病历也有同样的问题。我解决这个问题的方法是让一个组件负责观察集群。当我请求一个EMR集群时,我会得到一个集群id,然后传递给某个观察者。当集群改变状态时,观察者将调用我的其他组件。没有立即得到EMR的确认是一个有效的案例,不被视为例外


我不知道这是否适合你。也许你可以试着维护一下。在我的例子中,我只将它们保存在内存中,但如果需要,您可以将它们保存在某个持久的位置。

为这个问题添加更多的上下文:这是我们在Axemblr Provisionr上所做工作的一部分,Axemblr Provisionr是一种可以帮助您创建虚拟机池的服务。有趣的问题-我目前无法添加任何有建设性的内容,只能确认我在的上下文中遇到了各种类似的API延迟,并得出结论,AWS API需要被视为是全面的;e、 例如,我甚至遇到过这样的情况:我从一个create调用中收到一个资源id,可以根据它的id标记资源,但此后不再描述它,因为它应该不存在(还没有)。谢谢Steffen!我希望随着时间的推移情况会有所改善。使用LaunchGroup来确保请求的幂等性是个好主意