2010-09-28 3 views
0

Je suis en train de concevoir une application Web ASP.NET 4.0 où les administrateurs peuvent créer une enchère avec une expiration. L'heure d'expiration serait stockée dans une base de données. Comment puis-je m'assurer que l'enchère se termine à l'heure prédéterminée, compte tenu du fait qu'une instance d'application peut ne pas être en cours d'exécution lorsqu'il est temps? L'application sera hébergée avec IIS7. Je considère le service Windows, mais je me demande quelles sont les autres options.Quelle est la méthode préférée pour gérer un événement minuté avec une application Web?

Répondre

2

Un service Windows qui gère les événements temporisés est la meilleure pratique. L'utilisation d'un System.Threading.Timer dans ASP.NET est mauvaise juju; Cela PEUT fonctionner dans votre cas, car le changement effectué n'affecte pas directement l'interface utilisateur, mais je ne parierais pas que cela fonctionnerait parfaitement. Si vous devez planifier des événements en arrière-plan d'une application Web, utilisez une application serveur.

Une chose à garder à l'esprit; vous pouvez avoir des centaines ou des milliers d'enchères ouvertes à la fois. Si vous définissez une minuterie sur chaque enchère lors de son ouverture, vous aurez des centaines ou des milliers de threads inactifs gérés par ce serveur. Je ne chercherais que les ventes aux enchères qui se termineraient avant la prochaine fois que vous feriez normalement un sondage. Cela vous ramènerait peut-être à quelques douzaines de fils d'attente. Si vous écrivez le prochain eBay, cependant, même cela va s'étouffer lorsque vous obtenez des centaines de milliers, ou des millions, de ventes aux enchères, et plusieurs centaines ou milliers commencent et se terminent chaque minute.

+1

pourquoi tant de threads? pour chaque vente aux enchères? pourquoi pas juste le premier qui expire? –

+0

Cela fonctionne aussi. Pour un site occupé, vous voudrez probablement toujours avoir quelques threads qui suivent la fin et qui se terminera dans les prochaines secondes après cela. Le point était, ne crée pas un fil de minuterie pour chaque enchère unique. – KeithS

2

Si vous voulez qu'il soit fiable à 100%, un service Windows exécutant toute la logique programmée est la solution. Comme vous le dites, vous ne pouvez pas faire confiance à une application Web, car elle ne fonctionne même pas.

4

Vous pouvez choisir entre deux scénarios ici:

  • Lazy avec l'application web
  • active avec un service

Scénario Lazy

Sauf si vous devez interagir instantanément avec le gagnant d'une vente aux enchères, vous pouvez attendre le démarrage de l'application et laisser l'application rmine s'il y a des ventes aux enchères qui ont expiré. Rassemblez-les au moment et manipulez-les en conséquence.

Scénario actif

Créer un service qui prend la première vente aux enchères expirant de la DB. Stockez ce DateTime et laissez le service dormir jusqu'à l'expiration de la vente aux enchères. Augmentez le service à cette DateTime et traitez l'enchère expirante. Ensuite, laissez le service rechercher les prochaines enchères et expirez à nouveau. Et ainsi de suite .. Je pense que The Windows Workflow Foundation contient tous les outils et les exigences pour cette pratique.

Quelque chose entre

Activer un programmateur qui se réveille vous web-app toutes les heures/demi-heure/15 minutes et faire les choses paresseux. Utilisez un planificateur comme HostMonitor.

+0

+1. Beau résumé, ne pouvait pas mieux l'écrire – citronas

Questions connexes