2017-01-21 3 views
1

Je lance mon application rails à l'aide d'un Docker. Les travaux retardés sont maintenant traités par un seul travailleur qui s'exécute dans un contariner distinct appelé worker et il s'exécute avec une commande bundle exec rake jobs:work.Rails travail retardé et docker: ajouter plus de travailleurs

J'ai plusieurs types de travaux que je voudrais déplacer dans une file d'attente séparée et créer un travailleur distinct pour cela ou au moins avoir deux travailleurs pour les tâches de processus. J'ai testé mon conteneur de travail avec env QUEUE=default_queue bundle exec rake job:work && env QUEUE=another_queue bundle exec rake job:work bit qui n'a aucun sens. Il n'échoue pas, il commence mais les travaux ne sont pas traités. Y a-t-il un moyen d'avoir des travailleurs séparés dans un conteneur? Et est-ce correct? Ou devrais-je créer un conteneur séparé pour chaque travailleur que je voudrais créer?

Merci d'avance!

Répondre

2

L'exécution de la commande command1 && command2 entraîne l'exécution de command2 uniquement lorsque la commande1 est terminée. rake jobs: le travail ne s'arrête jamais, même lorsqu'il a fini d'exécuter tous les jobs de la file d'attente, donc la seconde commande ne sera jamais exécutée. Un simple "&" est probablement ce que vous cherchez: command1 & command2. Ceci exécutera les commandes indépendamment dans leurs propres processus. Vous devez utiliser le script delayed_job à la production, et il est recommandé de placer les opérateurs de différentes files d'attente dans des conteneurs différents si l'une des files d'attente contient des tâches qui utilisent beaucoup de ressources.

Cela commencera un travailleur de l'emploi retardé pour la default_queue:
bundle exec script/delayed_job --queue=default_queue start
Pour Rails 4, il est: bundle exec bin/delayed_job --queue=default_queue start
Vérifiez cette réponse sur le sujet: https://stackoverflow.com/a/6814591/6006050

Vous pouvez également lancer plusieurs travailleurs en processus séparés utilisant l'option -n. Cela commencera 3 travailleurs dans des processus distincts, tous cueillette des travaux de la default_queue:
bundle exec script/delayed_job --queue=default_queue -n 3 start

Les différences entre les rake jobs:work et le script delayed_job:
Il semble que la seule différence est que rake jobs:work commence le traitement des travaux au premier plan, alors que Le script delayed_job crée un démon qui traite les tâches en arrière-plan. Vous pouvez utiliser celui qui convient le mieux à votre cas d'utilisation.
Vérifiez ce problème de github: https://github.com/collectiveidea/delayed_job/issues/659

+0

Merci pour votre réponse, je vais essayer bientôt. Pour autant que je ne sois pas un utilisateur averti de Rails, pouvez-vous s'il vous plait dire (ou donner un lien vers) quelle est la différence entre exécuter 'rake jobs: work' et' script/delayed_job ..'? De plus, dans mon projet, il n'y a pas de dossier 'script'. Je ne l'ai pas fait moi-même à partir de zéro, je viens de soutenir le projet, donc je ne sais pas pourquoi c'est si ... – Ngoral

+0

J'ai édité ma réponse pour ajouter la différence entre les travaux rake: travail et le script delayed_job. Aussi ajouté que pour les rails 4, il devrait être 'bin/delayed_job' au lieu de' script/delayed_job'. – Reub

+0

merci beaucoup! maintenant je vois tout ça. Et ai-je raison: dans le cas où 'rake' l'exécute au premier plan, nous ne pouvons pas exécuter plusieurs travaux comme pour' bin/d_j' en utilisant '-n'? Je ne veux pas utiliser _exactly_ '-n' mais smth similaire à. – Ngoral