2013-02-06 64 views
6

我正在使用Java AWS SDK來製作EC2競價實例請求。與按需實例相反,API for spot requests沒有類似於ClientToken的任何內容,因此不支持開箱即用的冪級性。實現AWS競價實例請求的冪等性

我能想到的最直接的方法是將LaunchGroup屬性設置爲唯一的UUID;當我檢查我打電話給DescribeSpotInstanceRequests時,看看我是否已經有相同發射組的請求。

令我驚訝的是,在描述調用返回之前發送的現場請求之前似乎有延遲。我爲此寫了一個JUnit測試,看來爲了保持一致,我必須在兩個調用(請求專題實例和描述專題實例請求)之間設置至少60秒的超時時間。我需要一個10s的粒度,因爲我的請求可以在此間隔時間內被應用程序重複,以防發生任何故障 - 即在我發送請求之後,但在我讀取從亞馬遜返回的結果之前,某些事情會中斷。在這種情況下,我不想重複這個請求,我只是想看到它已經註冊並繼續前進。

@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設置爲60s,則每次測試都有效; 40-50s間歇性地工作。任何低於此值的每次都會失敗。

有沒有人設法解決這個延遲?是否僅僅使用AWS API來實現現貨請求的冪等性,而不是將狀態保存在客戶端應用程序中?

+0

爲這個問題添加更多的上下文:這是我們在Axemblr Provisionr上做的工作的一部分 - 這項服務可以幫助您創建虛擬機池。 https://github.com/axemblr/axemblr-provisionr –

+1

有趣的問題 - 除了確認我已經在[Bamboo AWS Plugin](https: //plugins.atlassian.com/plugin/details/774227),並得出結論認爲,AWS API只需要在整個董事會中被視爲[_eventually consistent_](http://en.wikipedia.org/wiki/Eventual_consistency)。例如,我甚至遇到過我從create調用中收到資源id的情況,可以根據它的id標記資源,但之後不會再描述它,因爲它可能不存在(還)。 –

+0

謝謝Steffen!我希望事情會隨着時間的推移而改善 –

回答

0

在這種情況下,我不想重複請求,我只是想看到它已註冊並繼續前進。

如果你有200回,那就註冊了。它可能不會立即顯示,但它已註冊,您可以在流程中繼續前進。

是否正在實現對可能使用AWS API的現貨請求的冪等性,而不是將狀態保存在客戶端應用程序中?

我不這麼認爲。我與亞馬遜的EMR有同樣的問題。我周圍的工作方式是讓一個組成部分是觀察集羣的工作。當我請求一個EMR集羣時,我得到一個集羣ID,然後我將它傳遞給一些觀察者。當該羣集更改狀態時,觀察者將調用其他組件。沒有被EMR立即確認是有效的情況,不被視爲例外。

我不知道這是否適合您。也許你可以嘗試保持SpotInstanceRequestId。就我而言,我只是把它們留在記憶中,但是如果需要的話,你可以把它們留在持久的地方。