2010-03-23 5 views
5

Une partie de l'application sur laquelle je travaille est un swf qui montre un test avec environ 80 questions. Chaque question est enregistrée dans SQL Server via WebORB et ASP.NET.Mise en file d'attente à l'aide de la base de données ou de MSMQ?

Si un candidat termine le test, la session doit être validée. Le problème est que quelquefois 350 candidats terminent leur test au même moment, et la CPU sur le serveur web et SQL Server explose (350 validations en même temps).

Maintenant, comment dois-je implémenter la mise en file d'attente ici? Dans la base de données, il y a une table qui a un enregistrement pour chaque session. Une colonne contient le statut. 1 est terminé, 2 est validé.

je pourrais mettre en œuvre des files d'attente de deux façons (comme je le vois, peut-être que vous avez d'autres propositions):

  • Un processus qui vérifie la table des enregistrements avec le statut 1. Si elle trouve un, il valide la session. Ainsi, les sessions sont validées une après l'autre.
  • Si un candidat termine sa session, un message est envoyé à une file d'attente MSMQ. Un autre processus écoute la file d'attente et valide les sessions une après l'autre.

maintenant:

  • Quelle serait la meilleure approche?
  • Où commencez-vous le processus qui va valider les sessions? Dans votre global.asax (application_start)? En tant que service Windows? En tant qu'exe à la racine du site Web démarré dans application_start?

Pour moi, l'utilisation de la table et la recherche d'enregistrements avec le statut 1 semble le moyen le plus facile.

Répondre

4

Le MSMQ approche decouples votre application Web à partir du service de logique de validation et de la base de données.

Cela apporte de nombreux avantages, dont quelques-uns:

  • Il serait plus facile de gérer les situations où la logique de validation peut gérer 5 sessions par seconde, et il reçoit 300 à la fois. Sinon, vous devrez gérer les délais d'attente copiés, les tentatives de nouvelle tentative, etc.

  • Il serait plus facile de faire maintanance sur le service de validation, sans avoir à interrompre le reste de l'application. Lorsque le service de validation est supprimé, les messages sont mis en file d'attente dans MSMQ et sont traités à nouveau dès qu'ils sont affichés.

  • La même chose que ci-dessus s'applique à la maintenance de la base de données.

1

Qu'est-ce que validating? Avant de travailler sur votre stratégie de mise en file d'attente, j'essaierais de faire le validating aussi vite que possible, y compris en le faisant passer à la base si ce n'est déjà fait.

+0

J'ai basé sur googled basé, mais je ne suis pas tout à fait sûr de ce que vous entendez par là. J'ai fait la validation aussi vite que possible (maintenant à 500ms par session) mais quand même, si 350 candidats valident en même temps, cela fait 175 secondes. Bien que, il est loadbalanced, donc en fait c'est 350/4 sec. Cela fonctionne mais le processeur de webserver est proche de 100% pendant quelques minutes. –

+1

en utilisant des opérations "set based" en ce qui concerne la programmation de base de données est lorsque vous émettez une seule commande de base de données, comme UPDATE et affecte toutes vos lignes, par opposition à chaque ligne et faire une mise à jour séparée sur chacun. J'ai fait un google sur "base de données base de traitement" et voici deux articles de près du sommet: http://www.codeproject.com/KB/database/SetAndProceduralSQL.aspx et http://weblogs.sqlteam.com/jeffs /archive/2007/04/30/60192.aspx –

3

Si vous n'avez aucune expérience de l'utilisation de MSMQ et qu'aucune infrastructure n'est configurée, je vous déconseille de le faire. Bien sûr, il pourrait s'agir de la "bonne" façon de faire la mise en file d'attente sur la plate-forme Microsoft, mais ce n'est pas très simple et a une courbe d'apprentissage.

Il en va de même pour la création d'un service Windows; Ne le faites pas à moins que vous ne le sachiez. Pour les cas simples comme celui-ci, je dirais que la douleur est plus grande que les récompenses.

La solution la plus simple serait probablement d'utiliser la table et d'exécuter le processus sur un thread d'arrière-plan que vous démarrez dans global.asax. Vous voudrez probablement aussi créer une page d'administration qui peut rapporter des informations d'état sur le processus (nombre de tâches en attente, etc.) et peut-être un bouton pour redémarrer le processus s'il échoue pour une raison quelconque.

0

Je l'ai récemment étudié moi-même si je voulais mentionner mes conclusions. L'emplacement de la base de données par rapport à votre application est un facteur important pour décider quelle option est la plus rapide.

J'ai testé en insérant le temps qu'il fallait pour insérer 100 entrées de base de données par rapport à la journalisation exactement les mêmes données dans un message MSMQ local. J'ai ensuite pris la moyenne des résultats de l'exécution de ce test plusieurs fois. Ce que j'ai trouvé, c'est que lorsque la base de données est sur le réseau local, l'insertion d'une ligne était jusqu'à 4 fois plus rapide que la connexion à un MSMQ. Lors de l'accès à la base de données via une connexion Internet décente, l'insertion d'une ligne dans la base de données était jusqu'à 6 fois plus lente que la connexion à un MSMQ.

Alors:

base de données locale - DB est plus rapide, sinon MSMQ est.

+0

Je me porte garant de cette opinion, j'ai ressenti la même chose. J'ai essayé d'insérer 100 enregistrements dans la base de données qui est dans mon réseau dans mon propre bâtiment, puis j'ai créé MSMQ privé dans mon ordinateur portable et j'ai fait de même. Le MSMQ a pris plus de 1,5 fois plus de temps que la base de données. Je suppose que MSMQ est bon quand vous avez un certain nombre de services qui veulent écrire les données au même endroit. –

+0

Je suis tombé sur cette citation: "SSB sera significativement plus rapide que MSMQ en mode transactionnel MSMQ sera plus rapide si on le laisse fonctionner en mode non-transféré (meilleur effort, non-ordonné, livraison)". Alors ... est-il possible de spécifier si vos tests ont été exécutés avec une file d'attente traitée ou une liste non traduite? – Mario

Questions connexes