Comment mettre en file d'attente au mieux un travail de longue durée

J’ai donc un plugin qui lance Ansible pour effectuer une installation de Discourse (je veux vraiment, vraiment arrêter d’utiliser WordPress pour prendre des commandes d’installation !).

Au début, j’utilisais fork pour lancer le processus, ce qui fonctionnait bien en test, mais j’ai pensé qu’il fallait le faire de manière plus « à la Discourse ».

J’ai donc créé un travail ponctuel pour exécuter le processus, mais il est tué comme ceci :

E, [2020-12-16T12:53:39.662683 #3158277] ERROR -- : worker=0 PID:3158425 timeout (61s > 60s), killing

J’ai essayé d’ajouter sidekiq_options queue: 'low' à la classe, puis à la fonction qui exécute le travail.

Ensuite, j’ai évité que le travail lance le processus et je l’ai exécuté directement dans le modèle avec :

         Discourse::Utils.execute_command(*instructions)

Cela fonctionne parfaitement si je l’exécute depuis rails c, mais peu importe comment je le lance (c’est un environnement de développement Ubuntu démarré avec ./bin/unicorn), il est tué.

1 « J'aime »

Les travaux ponctuels sont des tâches qui ne s’exécutent qu’une seule fois. Il semble que ce dont vous avez besoin soit un travail régulier qui sera déclenché par un événement, comme une requête atteignant un contrôleur.

Les travaux réguliers peuvent durer plus de 60 secondes, comme cela se produit parfois en utilisation normale.

1 « J'aime »

Bon, je l’ai déplacé vers un travail régulier et j’ai essayé de l’exécuter avec ./bin/rails s au lieu de ./bin/unicorn, mais toujours sans succès.

Cela n’a aucun sens, car je sais que beaucoup de ces tâches prennent plus d’une minute.

Comment exécutez-vous exactement la tâche ? Pouvez-vous coller la partie pertinente du code Ruby ?

Bien sûr !

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/jobs/regular/create_droplet.rb

https://github.com/pfaffman/discourse-pfaffmanager/blob/master/app/models/pfaffmanager/server.rb#L150-L172

Pourquoi utilisez-vous

Jobs::CreateDroplet.new.execute(server_id: id)

au lieu de

Jobs.enqueue(:create_droplet, server_id: id)

dans https://github.com/pfaffman/discourse-pfaffmanager/blob/49f7369b1dc0b1c8f63065b14c92ac7ecc3ab2b3/app/models/pfaffmanager/server.rb#L146 ?

2 « J'aime »

Et c’est bien pour cela que j’ai besoin de poser des questions ! C’est parce que je suis juste un homme des cavernes. (Aucune offense n’est destinée à quiconque habite dans une grotte.)

Il n’y a bien sûr aucune raison. Je n’arrivais simplement pas à comprendre comment je devais l’appeler !

Merci beaucoup !

… et ça tourne toujours ! …

Merci beaucoup. Cela m’a pris au moins quelques heures…

Prochaine étape : l’exécuter sur un véritable serveur de production…

4 « J'aime »