Używam pakietu Java AWS SDK do tworzenia żądań instancji punktów EC2. W przeciwieństwie do przypadków na żądanie, API for spot requests nie ma nic podobnego do ClientToken
i dlatego nie obsługuje idempotencji po wyjęciu z pudełka.Implementacja idempotencji dla żądań wystąpienia punktu AWS
Najprostszym sposobem, w jaki mogłem to zrobić, było ustawienie właściwości LaunchGroup
na unikatowy identyfikator UUID; kiedy to sprawdzam, dzwonię pod numer DescribeSpotInstanceRequests
i sprawdzam, czy mam już żądanie z tą samą grupą uruchamiania.
Ku mojemu zaskoczeniu wydaje się, że istnieje opóźnienie, zanim wywołanie opisu zwróci wysłane wcześniej żądania dodatkowe. Napisałem do tego test JUnit i wydaje mi się, że aby był spójny, musiałbym ustawić limit czasu wynoszący co najmniej 60 sekund między dwoma wywołaniami (instancja żądania żądania i opis żądania instancji punktu). Muszę mieć ziarnistość 10 sekund, ponieważ moje żądania mogą zostać powtórzone przez aplikację w tym przedziale, w przypadku jakiejkolwiek awarii - tj. Coś zepsuło się po wysłaniu żądania, ale zanim mogłem odczytać wynik, wróciłem z Amazon. W takim przypadku nie chcę powtarzać prośby, chcę tylko, aby została zarejestrowana i przejdzie dalej.
@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);
}
Test działa za każdym razem, gdy TIMEOUT jest ustawiony na 60s; przez 40-50 lat działa z przerwami. Wszystko poniżej tego zawodzi za każdym razem.
Czy ktoś zdołał obejść to opóźnienie? Czy implementacja idempotencji dla żądań dodatkowych jest możliwa przy użyciu tylko interfejsu API AWS i czy nie ma stanu zapisanego w aplikacji klienckiej?
Aby dodać nieco więcej kontekstu do tego pytania: Jest to część pracy, którą wykonujemy na Axemblr Provisionr - usługa, która może pomóc w tworzeniu pul wirtualnych maszyn. https://github.com/axemblr/axemblr-provisionr –
Interesujący problem - nie mogę dodać niczego konstruktywnego, innego niż potwierdzenie, że napotkałem różne podobne opóźnienia API w kontekście wtyczki [Bamboo AWS] (https: //plugins.atlassian.com/plugin/details/774227) i doszli do wniosku, że interfejs API AWS musi być traktowany jako [zawsze konsekwentny_] (http://en.wikipedia.org/wiki/Eventual_consistency) tylko we wszystkich obszarach; na przykład, Nawet natknąłem się na przypadki, w których otrzymałem identyfikator zasobu z wywołania, mogę oznaczyć zasób na podstawie jego identyfikatora, ale nie będę go dalej opisywał, ponieważ podobno nie istnieje (jeszcze). –
Dzięki Steffen! Mam nadzieję, że z biegiem czasu sytuacja ulegnie poprawie. –