0

Я недавно перенес свой проект Symfony на эластичный бобовый стебель из среды EC2 с ручным масштабированием, и я наткнулся на проблему.Отдельный экземпляр cronjob в Amazon ElasticBeanstalk

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

В среде ручного масштабирования у меня просто был первичный сервер, у которого был crontab и выполнялся подсистема, но это, похоже, не является выполнимым.

Любые предложения по настройке этого в среде автоматического масштабирования без основного сервера?

Я изучил JMSJobQueueBundle, но он также полагается, что супервизор работает только с одним экземпляром crontab, это будет дублировать в среде автоматического масштабирования.

Является ли мой лучший выбор, чтобы внешний сервер выполнял ping мой API каждые X минут и запускал задание в одном экземпляре, который он пингирует? Это, похоже, представляет собой еще один момент неудачи.

ответ

2

Как предупреждение, проблема, которую вы пытаетесь решить, не является тривиальной.

Несколько вариантов:

  1. При подключении к базе данных MySQL, получить блокировку (https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_get-lock) в начале сделки и снять блокировку в конце. это предотвратит одновременное выполнение нескольких cronjobs. работает только в том случае, если все обрабатывается внутри SQL.

  2. Как вы упомянули, вы можете использовать AWS Lambda + CloudWatch Events для запуска функции лямбда каждые x минут, а Lambda может запускать ваш скрипт через http (s). Но лямбда не гарантирует, что это делается ровно один раз, поэтому это небезопасно.

  3. Используйте услугу, в которой вы можете приобрести распределенный замок (например, etcd, consul, redis, ...) и реализовать аналогично тому, как это делается только в вашей базе данных MySQL. Тем не менее, вы не можете и не можете сказать точно один раз.

  4. положить cronjob в отдельный экземпляр ec2, где вы знаете, что он exsists только один раз (в случае, если этот экземпляр ec2 не работает, ничего не будет работать, но насколько я понимаю ваши требования, это не проблема, потому что скрипт может работать через 15 минут и еще догоняет со всей работой.

Чем больше «современный» подход в распределенных системах было бы сделать ваши действия идемпотент.

+0

Я попытаюсь создать рабочий. –

Смежные вопросы