(RAILS) Looping une coutume Rake toutes les 2 minutes, mauvaise idée? Une meilleure façon de mettre en œuvre?
-
13-09-2019 - |
Question
Je suis actuellement créé un fichier de coupe personnalisé qui effectue les opérations suivantes:
1.) Vérifie un flux externe des articles "NOUVEAU"
2.) Pour chaque nouveau élément du tableau d'alimentation, il met à jour ma base de données avec un nouveau record
3.) Je l'ai eu ce moment sur une boucle while. La boucle while a un (@loopcheck) variable d'instance qui est initialement réglé sur vrai, et si une exception est soulevée. Réinitialise à faux (de sorte que la boucle se termine).
Voici un exemple:
While(@loopcheck) do
begin
....(code here)...
rescue
Exception => e
@loopcheck = false
end
sleep(120)
End
Est-ce mauvais codage? Y a-t-il une meilleure manière de faire cela? Idéalement, je veux juste exécuter une tâche d'arrière-plan pour vérifier simplement un nouveau flux tous les 2-3 minutes. Je regardais dans Starling / Workling, mais qui semblait un peu exagéré, et je ne suis pas sûr de script / coureur en cours d'exécution via CRON, car il recharge tout l'environnement des rails à chaque fois. BackgroundRB un peu exagéré aussi? Non?
Je voulais juste obtenir quelques idées.
La solution
Combiner Cron avec le sommeil. Elle veillera à ce que les choses ne sont pas complètement briser vers le bas si vous frappez une exception. Chargement « environnement rails complets » est pas si mal: 3-6 secondes pire des cas. donc exécuter votre boucle de sommeil 5 fois. et la tâche cron de râteau pour exécuter toutes les 12 minutes. Sens?
*/12 * * * * rake your task
## your rake task - valid for 10 mins -- 5 x 2 mins sleep worth.
@loopcheck = true
1.upto(5) do
begin
....(code here)...
rescue
Exception => e
@loopcheck = false
end
break if not @loopcheck
sleep(120)
end
Autres conseils
Découvrez cette Railscast récente sur "Chaque fois que"
le lien est ici et les commentaires discuter des alternatives
Cette chose la plus simple qui pourrait éventuellement travailler, supposant que vous êtes sur un système Unix, est d'exécuter le script une fois toutes les deux minutes de Cron, sans la boucle / sommeil. Cela vous permet d'éviter d'avoir à surveiller et redémarrer votre script si elle échoue. Et si elle ne manque, vous Cron envoyer un email.
L'inconvénient de cette approche, comme vous l'avez dit, est que toutes les deux minutes, vous prenez un coup pour le démarrage d'un processus Ruby. Est-ce important? Seulement vous pouvez dire. J'ai plusieurs scripts comme celui-ci sur une boîte légèrement chargé, et d'oublier qu'ils sont encore là.