Обычно я решаю эту проблему, используя container_commands
, которую вы можете настроить в файле .config внутри папки .ebextensions
в своем приложении. The idea is that the code is executed on so-called 'leader' instance in your webservers pool. It is not considered as a bulletproof solution but does the job and mostly works (it will fail when autoscaling comes into play though).
Использование распределенной блокировки Mutex (redis-mutex или базы данных) для блокировки всех процессов, кроме тех, которые получают блокировку.
#create config file, use numbers/names that suit your needs:
#.ebextensions/02_container_commands.config
container_commands:
01_cron_tasks:
command: "cat .ebextensions/cron_tasks.txt > /etc/cron.d/yourapp && chmod 644 /etc/cron.d/yourapp"
leader_only: true
хроны подберут это, просто поместить определение кронтаба в .ebextensions/cron_tasks.txt
файле и добавить также эту к вашему Git репо.
0 5 * * * root bash -l -c "su -m webapp; cd /var/app/current && rake your_rake_task"
Это печально, но это, кажется, что команда Amazon AWS до сих пор не придумала правильным, удобным решением для планирования фоновых заданий с Rails в среде Elastic Beanstalk. Их уровень рабочих требует, чтобы вы добавили в свое приложение конечную точку, которая прослушивает сообщения из своей собственной реализации cron. Это плохо, потому что это заставляет вас добавить код, ориентированный на хостинг, в вашу основную логику приложения (маршруты, контроллеры) и требует большего количества серверов.
Другим недостатком AWS в сравнении с такими платформами, как Heroku, является отсутствие поддержки одним кликом для систем резервирования Redis, таких как Sidekiq, и рабочих по требованию, которые могут быть созданы с помощью cron-подобных планировщиков.
Не так знакомы с Rails, но проверьте это, возможно, это поможет. Https://github.com/collectiveidea/delayed_job – error2007s
Это приближает меня, но мне нужны мои задачи, настроенные для запуска через определенные промежутки времени (каждую минуту, каждый день в 11 вечера и т. д.) – jfefes
Вы не упомянули версию RDS, но если это MySQL или MariaDB, есть встроенный [планировщик событий] (https://dev.mysql.com/doc/refman /5.6/en/event-scheduler.html) ... –