2013-02-06 13 views
6

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?

+0

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 –

+1

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). –

+0

Dzięki Steffen! Mam nadzieję, że z biegiem czasu sytuacja ulegnie poprawie. –

Odpowiedz

0

W takim przypadku nie chcę, aby prośba była powtarzana, chcę tylko, aby została zarejestrowana i została przeniesiona.

Jeśli masz 200 pleców, oznacza to, że jest zarejestrowany. Może nie pojawić się od razu, ale jest zarejestrowany i możesz przejść do swojego przepływu.

Czy implementuje idempotencję dla żądań dodatkowych możliwych przy użyciu tylko interfejsu API AWS i czy nie ma stanu zapisanego w aplikacji klienckiej?

Nie wierzę w to. Mam podobny problem z EMR firmy Amazon. Sposób, w jaki pracuję, to mieć komponent, którego zadaniem jest obserwowanie klastrów. Kiedy zgłoszę żądanie dla klastra EMR, otrzymuję identyfikator klastra, który następnie przesyłam do jakiegoś obserwatora. Obserwator następnie wywoła moje pozostałe komponenty, gdy klaster ten zmieni stan. Nie uznanie przez EMR od razu jest uzasadnionym przypadkiem i nie jest traktowane jak wyjątek.

Nie mam pojęcia, czy to jest odpowiednie dla Ciebie. Być może mógłbyś spróbować zachować SpotInstanceRequestId. W moim przypadku przechowuję je tylko w pamięci, ale w razie potrzeby można je utrzymać w miejscu.

Powiązane problemy