私はEC2スポットインスタンス要求を行うためにJava AWS SDKを使用しています。オンデマンドのインスタンスとは対照的に、API for spot requestsはClientToken
と似ていないので、そのままの冪等性をサポートしていません。AWSスポットインスタンス要求の冪等性の実装
これを行うために私が考えることができる最も簡単な方法は、LaunchGroup
プロパティを一意のUUIDに設定することでした。私が確認すると、私はDescribeSpotInstanceRequests
に電話し、同じ打ち上げグループで既にリクエストがあるかどうかを確認します。
私の驚いたことに、記述コールが以前に送信されたスポットリクエストを返すまでに時間がかかるようです。私はこれについて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秒に設定されている場合は常にテストが行われます。断続的に動作します。これ以下のものは毎回失敗します。
誰もこの遅延を回避できましたか?現状の要求に対して、AWS APIのみを使用し、クライアントアプリケーションに状態を保存しないでidempotencyを実装できますか?
この質問にもう少しコンテキストを追加する:これは、Axemblr Provisionr上で行っている作業の一部です。仮想マシンのプールを作成するのに役立つサービスです。 https://github.com/axemblr/axemblr-provisionr –
興味深い問題 - 現在、[Bamboo AWS Plugin](https://www.windowsfiles.jp)のコンテキストでさまざまな同様のAPI遅延が発生したことを確認する以外には、 //plugins.atlassian.com/plugin/details/774227)、AWS APIは全面的にしか扱われていないと結論づけられました(http://en.wikipedia.org/wiki/Eventual_consistency)。例えば私は、作成呼び出しからリソースIDを受け取ったケースでも、そのIDに基づいてリソースにタグを付けることができましたが、まだそれが存在しないため(まだ)存在しないため、それ以降は記述しません。 –
ありがとうSteffen!物事は時間とともに改善されることを願っています。 –