我正在使用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來實現現貨請求的冪等性,而不是將狀態保存在客戶端應用程序中?
爲這個問題添加更多的上下文:這是我們在Axemblr Provisionr上做的工作的一部分 - 這項服務可以幫助您創建虛擬機池。 https://github.com/axemblr/axemblr-provisionr –
有趣的問題 - 除了確認我已經在[Bamboo AWS Plugin](https: //plugins.atlassian.com/plugin/details/774227),並得出結論認爲,AWS API只需要在整個董事會中被視爲[_eventually consistent_](http://en.wikipedia.org/wiki/Eventual_consistency)。例如,我甚至遇到過我從create調用中收到資源id的情況,可以根據它的id標記資源,但之後不會再描述它,因爲它可能不存在(還)。 –
謝謝Steffen!我希望事情會隨着時間的推移而改善 –