Запускать операцию только на 1 EC2, даже если есть 5 экземпляров

Пример использования:

Мне нужно периодически сканировать таблицу DynamoDB в течение 30 секунд. У меня пять экземпляров EC2, работающих в парке, но я хочу, чтобы по истечении 30-секундного интервала только один экземпляр EC2 из пяти должен выполнять сканирование в DynamoDB, а не все.

Как я могу реализовать этот механизм, если при запуске операции только 1 экземпляр EC2 должен выполнить операцию не все.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
19
1

Ответы 1

Для достижения цели вам нужно будет разработать стратегию для хостов EC2, чтобы согласовать, какой из них будет выполнять сканирование.

Есть несколько возможных решений, но одно, которое, вероятно, довольно просто реализовать, - это использовать оптимистичный параллелизм в DynamoDB для выбора хоста EC2 для каждого сканирования.

Либо в той же таблице (если это позволяет схема), либо в отдельной таблице создайте элемент расписание сканирования со следующими атрибутами:

  • key - первичный ключ (также может быть составным, если вам нужно модифицировать существующую схему таблицы), установленный на некоторое статическое значение, которое вы можете использовать для получения и размещения элемента.
  • host - строковый атрибут, который будет обновляться, чтобы отражать имя хоста, выполняющего сканирование, каждый раз при успешном запуске сканирования
  • lastScanTime - числовой атрибут, который будет обновлен до отметки времени эпохи, когда было запущено последнее сканирование, каждый раз при успешном запуске сканирования
  • version - числовой атрибут, который будет использоваться как монотонно увеличивающееся числовое значение с целью оптимистичного параллелизма (подробнее об этом ниже)

Теперь на каждом хосте EC2 настройте операцию для запуска каждые 30 секунд (может быть локальный cron, настроенный для запуска каждые 30 секунд).

Когда запланированная операция запущена, сделайте следующее:

  1. GetItem для чтения текущего значения элемента расписания сканирования, который мы только что обсудили выше
  2. Если lastScanTimestamp был более 25 секунд назад, попытайтесь обновить элемент с помощью информации этого хоста и установить lastScanTimestamp на текущую метку времени, также увеличивая атрибут version, используя условное выражение, который проверяет, что version == то же значение, которое было прочитано на шаге 1
  3. Если условное обновление выполнено успешно, может начаться операция сканирования; однако, если условное обновление не удается, это означает, что к нему первым подключился другой хост, и этот хост не должен продолжать сканирование.

Примечание, что ключом к приведенному выше алгоритму является условное выражение, которое позволяет вам условие последовательность чтения-изменения-записи, чтобы вы могли определить, изменил ли кто-то другой элемент в то время, когда вы прочитали статус и сделали попытку обновите его.

Есть ли способ, которым экземпляры EC2 обмениваются данными между собой и решают, какой из них является главным, а какие - подчиненными?

mshikher 31.03.2021 09:48

вы также можете пойти по этому пути, но вам придется реализовать протокол выборов лидера, который не так просто получить правильно (дополнительная информация здесь: aws.amazon.com/builders-library/…) - ИМО, система на основе аренды, такая как та, которую я предложил, проще получить правильно а также не требует больших затрат в эксплуатации

Mike Dinescu 31.03.2021 09:55

Другие вопросы по теме