2011-04-30 2 views
8

Je suis actuellement en train de concevoir une application web qui permettra aux utilisateurs de programmer des tâches qui seront exécutées sur une API HTTP (pour leur compte). Les tâches peuvent être récurrentes et la résolution temporelle minimale pouvant être utilisée pour la planification sera d'une minute. En raison de la nature des tâches, je pense qu'il est logique de les exécuter de manière asynchrone. Cependant, comment devrait ressembler l'architecture de cette partie?Architecture d'application Web - File d'attente de travaux/tâches nécessaire?

J'ai pensé utiliser une file d'attente de tâches pour créer des tâches par l'application web et les laisser être exécutées par un worker. Dans ce cas, j'ai plusieurs questions:

  • Comment gérer les tâches récurrentes?
  • Comment sauvegarder facilement les résultats des tâches?
  • Est-il facile de rendre la file d'attente "persistante"?
  • Les travailleurs doivent-ils interagir directement avec une base de données?
  • Devrais-je mettre en file d'attente les tâches récurrentes manuellement?

Que pourrais-je envisager d'autre? Puisque je suppose que je ne suis pas le seul à penser à ce type d'architecture d'application web, y a-t-il des «meilleures pratiques»? Une file d'attente de tâches est-elle le chemin à parcourir?

+0

Ceci est [pertinent] (http://stackoverflow.com/questions/5636051/cronjobs-in-node-js/5636298#5636298). Il montre comment implémenter les futures tâches dans 'node.js'. Changez simplement l'exécution des travaux en envoyant une requête HTTP. – Raynos

Répondre

9

Oui, il s'agit d'un modèle bien connu pour la gestion des tâches de longue durée à l'arrière d'une application Web. En fonction de votre langue et du cadre d'application, il existe un certain nombre d'implémentations de file d'attente - par ex. Resque ou Beanstalkd ou ActiveMQ ou si vos exigences de performances ne sont pas élevées, vous pouvez utiliser une table de base de données comme une sorte de file d'attente.

L'idée de base est que votre application Web place les travaux dans une file d'attente avec assez de contenu pour permettre au travail de continuer. Un groupe de processus de travail en arrière-plan (idéalement indépendant de votre application Web) lit les travaux en dehors de la file d'attente et les exécute. Les résultats peuvent être réécrits dans une file d'attente de réponses ou peut-être écrits dans une base de données. Cela dépend de la façon dont vous voulez afficher les résultats à l'utilisateur. Pour une application web, écrire des résultats dans la base de données a probablement plus de sens. En fonction de votre gestionnaire de files d'attente, ils peuvent rendre les tâches persistantes. Par exemple. ActiveMQ prend en charge la messagerie persistante afin que les messages d'une file d'attente soient récupérés en cas d'échec.

Vous posez des questions sur les travaux récurrents - et je pense que la réponse dépend du moment où ils doivent se reproduire.

Une file d'attente de messages directe traite/libère les messages aux travailleurs dès qu'ils sont disponibles. La planification est donc difficile ou impossible. Pour prendre en charge les tâches planifiées (y compris les tâches qui se répètent à un moment donné ou après un certain temps), vous devez probablement utiliser une table de base de données en tant que simple file d'attente avec un attribut "heure de début".

J'ai récemment décrit un modèle similaire here.

+0

Merci beaucoup. – Simon

+0

Supposons que j'utilise RabbitMq, ai-je besoin d'un service pour gérer la file d'attente? Comment ce travail est-il habituellement fait? Quelle est une bonne alternative à un service? – SynBiotik

Questions connexes