Je résout généralement ce problème en utilisant container_commands
que vous pouvez configurer dans un fichier .config à l'intérieur du dossier .ebextensions
dans votre application. 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).
Utilisez un verrou Mutex distribué (redis-mutex ou base de données sauvegardée) pour bloquer tous les processus sauf un qui obtient le verrouillage.
#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
Cron choisira ce, il suffit de mettre la définition dans le fichier crontab .ebextensions/cron_tasks.txt
et également ajouter celui-ci à votre git.
0 5 * * * root bash -l -c "su -m webapp; cd /var/app/current && rake your_rake_task"
Il est triste, mais il semble que l'équipe Amazon AWS ne toujours pas une solution appropriée, pratique pour les travaux d'arrière-plan de planification avec Rails dans des environnements Elastic Beanstalk. Leur niveau de travailleur exige que vous ajoutiez un point de terminaison dédié dans votre application qui écoute les messages de leur propre implémentation cron. Cela est mauvais car cela vous oblige à ajouter un code spécifique à l'hébergement à votre logique d'application principale (routes, contrôleurs) et nécessite l'exécution de plusieurs serveurs. Un autre inconvénient d'AWS par rapport aux plates-formes comme Heroku est le manque de support en un clic pour les systèmes de mise en file d'attente à support Redis comme Sidekiq et les opérateurs à la demande qui peuvent être générés via des planificateurs cron.
Pas si familier avec Rails mais vérifiez qu'il peut être d'une certaine aide https://github.com/collectiveidea/delayed_job – error2007s
Cela me rapproche, mais j'ai besoin de mes tâches mis en place pour fonctionner à certains intervalles (chaque minute, tous les jours à 23h, etc) – jfefes
Vous n'avez pas mentionné une version de RDS mais si c'est MySQL ou MariaDB, il y a le [scheduler d'événement] intégré (https://dev.mysql.com/doc/refman /5.6/fr/event-scheduler.html) ... –