Реализация идемпотентности для запросов выборки AWS
используя Java AWS SDK для создания запросов экземпляра EC2. В отличие от случаев по требованию,API для спотовых запросов не имеет ничего похожего наClientToken
и, следовательно, не поддерживает идемпотентность из коробки.
Самый простой способ сделать это - установитьLaunchGroup
свойство к уникальному UUID; когда я проверяю это, я звонюDescribeSpotInstanceRequests
и посмотреть, если у меня уже есть запрос с той же группой запуска.
К моему удивлению, кажется, чтоЗадержка перед вызовом описания возвращает спотовые запросы, отправленные ранее. Я написал для этого тест JUnit, и кажется, что для того, чтобы он был согласованным, мне нужно было установить тайм-аут не менее 60 с между двумя вызовами (запросить точечный экземпляр и описать запросы точечного экземпляра). Мне нужно иметь степень детализации 10 с, потому что мои запросы могут повторяться приложением с этим интервалом в случае любого сбоя - то есть что-то ломается после того, как я отправил запрос, но прежде чем я смог прочитать результат, я вернулся из Amazon. В этом случае я неЯ не хочу повторять запрос, я просто хочу, чтобы он был зарегистрирован и двигаться дальше.
@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 лет это работает с перебоями. Что-нибудь ниже этого терпит неудачу каждый раз.
Кому-нибудь удалось обойти эту задержку? Возможно ли реализовать идемпотентность для спотовых запросов, используя только API AWS и не сохраняя состояние в клиентском приложении?