Java AWS SDKを使用して、EC2スポットインスタンスリクエストを作成しています。オンデマンドインスタンスとは対照的に、スポットリクエストのAPIには類似したものがないため、そのままではべきClientToken
等性をサポートしていません。
これを行うために私が考えることができる最も簡単な方法は、LaunchGroup
プロパティを一意のUUIDに設定することでした。それを確認するときは、電話をかけDescribeSpotInstanceRequests
て、同じ起動グループのリクエストがすでにあるかどうかを確認します。
驚いたことに、describe呼び出しが以前に送信されたスポットリクエストを返すまでに遅延があるようです。私はこれについてJUnitテストを作成しましたが、一貫性を保つために、2つの呼び出し(スポットインスタンスの要求とスポットインスタンスの要求の記述)の間に少なくとも60秒のタイムアウトを設定する必要があるようです。失敗した場合、つまり、リクエストを送信した後、結果を読み取る前にAmazonから戻ってきた結果を読み取る前に何かが壊れた場合に、この間隔でアプリケーションによってリクエストが繰り返される可能性があるため、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が60秒に設定されている場合、テストは毎回機能します。40〜50秒間、断続的に動作します。これより下のものは毎回失敗します。
誰かがこの遅延を回避することができましたか?AWS APIのみを使用し、クライアントアプリケーションに状態を保存せずに、スポットリクエストのべき等を実装することは可能ですか?