Meilleures pratiques lors de la gestion de travaux asynchrones de longue durée

12

Je suis dans la phase de conception d'un projet où l'utilisateur final soumettra une demande à partir d'une page Web qui engendrera un travail traité asynchrone de longue durée. Existe-t-il une "meilleure pratique" pour ce problème? Les services Web et les courtiers de services sont-ils une bonne solution? La file d'attente de messagerie Microsoft est-elle applicable ici?

John Ruf
la source
Si vous effectuez cette opération sur le Web et si cela prend très longtemps, vous pouvez envoyer un message texte ou un e-mail à l'utilisateur une fois l'opération terminée.
Job

Réponses:

6

Je ne connais pas les "meilleures pratiques". Je connais les erreurs les plus courantes.

Première erreur: DOS vous-même

Vous utilisez le gestionnaire Web pour traiter le travail de longue durée. Cela peut être mauvais ou extrêmement mauvais en fonction de votre pourcentage de hits qui deviennent des travaux de longue durée, de leur durée et du trafic soutenu que vous obtenez.

Vous voulez vous assurer que vous n'obtiendrez pas plus d'un travail de longue durée dans la période de temps nécessaire pour terminer ce travail de longue durée. Si vous le faites vous-même DOS. Il s'aggravera également si vous augmentez le trafic en supposant que le pourcentage et le temps restent cohérents. C'est l'un de ces problèmes qui s'impose lui-même une limite à la croissance du trafic.

Deuxième erreur: le frai du webhandler

La création d'un processus à partir du gestionnaire Web pour gérer un processus de longue durée peut être délicate et, par conséquent, également sujette aux erreurs.

  • Vous devez vous dissocier correctement du parent sinon le webhandler attend que l'enfant se termine.
  • Lorsque vous créez un enfant sous Unix, il hérite des poignées ouvertes du parent. Ceux-ci seront automatiquement fermés, sauf s'ils sont remplacés. Cela inclut des éléments tels que les connexions à la base de données, les descripteurs de fichiers et d'autres connexions réseau ouvertes. Tous ces éléments sont fermés à la fin du processus enfant.

Les options

J'utilise habituellement at(1)pour me dissocier proprement du gestionnaire Web sans bifurquer.

Vous pouvez également utiliser une implémentation d'interrogation avec cron.

Vous pouvez communiquer avec un autre processus serveur qui gère le traitement. Cette communication peut être effectuée avec sockets, pipesou des abstractions de niveau supérieur comme un appel REST http ou le routage d'un message de file d'attente.

Dietbuddha
la source
2

Je suppose que vous parlez de plus de quelques minutes.

Si c'est quelques minutes, vous pouvez lancer un thread de travail en arrière-plan et afficher une certaine progression sur l'interface utilisateur. De nombreuses applications Web utilisent cette méthode.

Si c'est plus que, disons 5 minutes, vous pouvez vouloir déléguer la tâche à un service dédié. Un exemple est les rapports générés par Google Analytics.

La file d'attente Microsoft Messaging peut être utilisée pour transmettre des informations d'un système à un autre ou d'un composant à un autre.


la source
Comment les langages comme PHP accomplissent-ils cela? Je connais quelques applications Web qui font cela mais qui sont écrites en PHP
TheLQ
Je ne suis pas un expert PHP, mais je suppose qu'au lieu d'un thread lancé par la même page, un autre est appelé. C'est ce qui se passe réellement avec AJAX.