6

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のみを使用し、クライアントアプリケーションに状態を保存せずに、スポットリクエストのべき等を実装することは可能ですか?

4

1 に答える 1

0

その場合、リクエストを繰り返したくないので、登録されたことを確認して先に進みたいだけです。

200 が返ってきたら、それは登録されています。すぐには表示されない場合がありますが、登録されているので、フローを進めることができます。

クライアントアプリケーションに状態を保存せずに、AWS API だけを使用してスポットリクエストのべき等性を実装することは可能ですか?

私はそうは思いません。Amazon の EMR にも同じような問題があります。私がそれを回避する方法は、クラスターを観察することを仕事とするコンポーネントを用意することです。EMR クラスターをリクエストすると、クラスター ID が返され、オブザーバーに渡されます。オブザーバーは、クラスターの状態が変化したときに他のコンポーネントを呼び出します。EMR によってすぐに確認されないことは有効なケースであり、例外として扱われません。

それがあなたに適しているかどうかはわかりません。おそらく、SpotInstanceRequestIdを維持してみてください。私の場合、私はそれらをメモリに保持するだけですが、必要に応じてどこかに永続的に保持することができます.

于 2013-12-23T21:50:31.397 に答える