После поиска hi и lo для наилучшего способа запуска задания cron при развертывании приложения, использующего Amazon Elastic Beanstalk с автоматическим масштабированием, масштабирование включено, я столкнулся с несколькими решениями.Использование MySQL LOCK TABLE для обеспечения одного экземпляра задания cron в облаке (автомасштабирование EC2/ELB)
Проблема: проблема с запуском cron
в beanstalk (или облаке с автоматическим масштабированием) заключается в том, что каждый экземпляр будет иметь собственный демон cron, и скрипт будет запускать много копий одновременно (на каждом экземпляре EC2), когда он автоматически масштабируется.
Solutions предложила:
- Используйте экземпляр уборщица + SQS
- Проблема: это слишком сложно, и я не хочу быть выставлен счет за дополнительный экземпляр по одной простым хронам работы, как отправка оповещения пользователю.
- Использование cronlock
- Проблема: требует установки центрального Redis разъединить.
Мое решение:
Мой сайт уже есть сервер Mysql (Amazon RDS), и поэтому я думал, что, возможно, это может работать?
- Я могу создать таблицу только с одним полем
last_run
. - Создайте следующий скрипт и добавить его в демон cron вместо:
LOCK TABLES crond WRITE
- Считайте значение в
crond
.last_run
- Если
time()
-last_run
> 5 (то есть 5 секунд прошло), то я обновления времени вlast_run
поле текущегоtime
. - Если
time()
-last_run
< 5, то я сразу же выйти говоря, хрон был выполнен менее чем за 5 секунд назад (то есть какой-то другой экземпляр получил ЗАМОК первый) UNLOCK TABLES
.- Spawn фактических хрон сценарий (ы), если
last_run
> 5 (то есть # 3 верно)
Вопросы:
- Будет ли это быть достаточным, чтобы гарантировать, что только одна копия cron работает одновременно?
- Есть ли более простые альтернативы тому, чего я пытаюсь достичь?
Ваши идеи будут полезны, прежде чем я буду проектировать и проверять эту вещь.
Вы задумывались над использованием запланированной функции лямбда вместо cron? Это, безусловно, будет проще, чем предлагаемое вами решение, и намного дешевле, чем выделенный экземпляр cron. –
привет, нет, я не знал об этом. Спасибо за подсказку, я буду искать дополнительную информацию об этом – supersan