Quelle est la meilleure façon d’exécuter les tâches planifiées dans un environnement de Rails ? Script/runner ? Râteau ?
Réponses
Trop de publicités?J’ai utilisé le très populaire chaque fois que sur des projets qui s’appuient fortement sur les tâches planifiées, et c’est génial. Il vous donne une belle DSL pour définir vos tâches planifiées au lieu d’avoir à traiter avec le format de la crontab. Depuis le README :
Chaque fois qu’est un gem Ruby qui fournit une syntaxe claire pour l’écriture et le déploiement des tâches cron.
Exemple de fichier Lisezmoi :
J’utilise l’approche de râteau (prises en charge par heroku)
Avec un fichier appelé lib/tasks/cron.rake...
Pour exécuter la ligne de commande, c’est juste « cron râteau ». Cette commande peut ensuite être mises sur le planificateur de tâche cron/système d’exploitation tel que désiré.
Récemment Railscasts.com déployé de très intéressants jette sur ce sujet. Ils couvrent de nombreux cas. Regarder les épisodes et de décider par vous-même.
- Épisode 127 - Râteau en arrière-plan
- Épisode 128 - Starling et workling (celui-ci est fait pour vous)
- Épisode 129 - Custom Démon
- L'épisode 164 - Cron en Ruby avec Chaque Bijou
- L'épisode 164 - Cron en Ruby (révisée) (Vous avez à payer pour celui-ci)
Dans notre projet, nous avons d'abord utilisé chaque fois que gem, mais face à certains problèmes.
Nous avons ensuite passé à RUFUS PLANIFICATEUR de gem, qui s'est avéré pour être très facile et fiable pour l'ordonnancement des tâches dans les Rails.
Nous les avons utilisés pour l'envoi hebdomadaire et journalière mails, et même pour l'exécution de certains périodiques râteau de tâches ou de toute méthode.
Le code utilisé dans le présent, c'est comme:
require 'rufus-scheduler'
scheduler = Rufus::Scheduler.new
scheduler.in '10d' do
# do something in 10 days
end
scheduler.at '2030/12/12 23:30:00' do
# do something at a given point in time
end
scheduler.every '3h' do
# do something every 3 hours
end
scheduler.cron '5 0 * * *' do
# do something every day, five minutes after midnight
# (see "man 5 crontab" in your terminal)
end
Pour en savoir plus: https://github.com/jmettraux/rufus-scheduler
En supposant que vos tâches de ne pas prendre trop de temps, il suffit de créer un nouveau contrôleur avec une action pour chaque tâche. Mettre en œuvre la logique de la tâche en tant que contrôleur de code, Puis mis en place une tâche cron au niveau de l'OS qui utilise wget pour appeler l'URL de ce contrôleur et l'action à intervalles appropriés. Les avantages de cette méthode sont vous:
- Avoir un accès complet à tous vos Rails objets comme un contrôleur de la normale.
- Pouvez développer et tester comme vous le faites des actions normales.
- Pouvez également appeler vos tâches ad hoc à partir d'une simple page web.
- Ne pas consommer plus de mémoire par des tirs supplémentaires ruby/rails de processus.