Question

Je dois proposer la planification des actions / événements sur notre site Web. Une analogie merdique pourrait être un système de calendrier, où une personne ajoute un élément de calendrier et lorsque la date / heure a été "frappé", puis une certaine logique (par exemple, calculer un rapport) est déclenchée.

Je pourrais avoir des centaines voire des milliers d'événements programmés qui sont entrés par mes clients. Lorsqu'un client saisit quelque chose à planifier, je sauvegarde ces informations dans la base de données. Ensuite, je suppose que je vais ajouter un événement / travail quelque part, qui contiendra la clé primaire de la table de base de données. lorsque l'événement doit être déclenché, je saisis cette information de la base de données, puis je fais la logique. fait.

Quelles sont les solutions courantes pour gérer cela?

J'utilise .NET 3.5 SP1. La base de données est SQL Server 2008. L’UI sera Web cependant.

Je ne savais pas si les gens utilisaient MSMQ? Ou quelque chose construit dans Sql Server? Ou une bibliothèque open source (par exemple, Quartz.NET ) avec un service NT. Le serveur sera l’édition Windows 2008 standard.

Aussi, veuillez ne pas suggérer d'utiliser un équivalent de travail cron, ni aucun script de ligne de commande, etc.

Enfin, et c’est un objectif secondaire .. j’adorerais l’incruster sur azur pour le rire et le rire… est-ce possible aussi? ce n'est qu'une idée de liste de souhaits. Je préférerais le faire sur une boîte dédiée si la solution est plus facile que d’utiliser Azure.

a bientôt:

modifier: la logique à traiter lorsqu'un événement doit être déclenché, sont des tâches en arrière-plan. Aucune interface utilisateur requise.

Était-ce utile?

La solution

Quartz.NET pourrait probablement aussi très bien répondre à ces exigences. Les avantages que je vois concernent les différentes manières de configurer le planificateur (calendriers CronTrigger +) et la possibilité d’avoir vos tâches dans de petites unités de code testable (tâches).

Quartz.NET vous fournit également la distribution nécessaire et le basculement avec les fonctionnalités de mise en cluster. Une fonctionnalité intéressante est également les configurations configurables de gestion des ratés d'allumage configurables par déclencheur qui vous permettent de réagir aux ratés et aux temps d'arrêt du planificateur.

SQL Service Broker semble avoir l’avantage de ne pas interroger. Je me demande si ce sera toujours le problème, mais le courtier a l’inconvénient de paraître un peu compliqué (au moins d'après la description que j'ai lue ci-dessus).

Seulement mon parti pris 0,02 $.

Autres conseils

Workflow Foundation peut le faire. Utilisez une activité de retard , définissez TimeSpan sur (DesiredTimeOfExecution - Now) . Pour les systèmes à plus grande échelle, définissez UnloadOnIdle sur true et les flux de travail en attente seront conservés jusqu'à leur utilisation.

Voici un exemple très simple de l'activité de retard .

WF est Free , inclus dans le cadre du .NET Framework 3.0.

Ce que vous voulez, c'est SQL Server Service Broker.

Vous pouvez effectuer un accès chronométré à la base de données pour interroger des données de calendrier, etc. Il est basé sur un message, plus puissant que MSMQ, ne nécessite aucune interrogation et peut être utilisé dans des environnements distribués si c'est ce dont vous avez besoin. Ça marche très bien pour moi!

Vous utiliserez une procédure stockée pour placer vos informations d'événement sur une file d'attente SSB de la base de données. Vous laisserez à ce message le temps de réveiller et de traiter ultérieurement une autre procédure stockée qui saisit vos données d'événement et la met dans une file d'attente de collecte qui effectue une "activation externe". EA envoie une notification à un service Windows qui pointe vers une application de console. Cette application de la console récupère les informations sur l'événement de la file d'attente de collecte. Vous avez maintenant vos données d’événement à l’heure précise à laquelle vous le souhaitez. Traitez-la comme bon vous semble dans l'application de la console.

Il existe une courbe d'apprentissage, mais cela en vaut la peine si vous avez besoin de la fiabilité, de la flexibilité et de l'évolutivité offertes par SQL Service Broker. Vous trouverez ci-dessous des liens pour vous aider à démarrer.

Voici une comparaison: SQL Service Broker contre MSMQ

SO ne me permettrait malheureusement que de poster un lien. Sinon, je pourrais vous indiquer plus de ressources pour vous aider à démarrer avec SSB.

J'espère que ça aide!

Une option pourrait être de créer un travail SQL à exécuter à n'importe quel intervalle le plus granulaire et de traiter ensuite tous vos événements.

Si vous voulez tirer le meilleur parti des mondes .NET et SQL Server, vous pouvez utilise également les travaux SQL et appelle le code géré . Je n'ai aucune expérience de cette solution et je m'excuse dès le départ si les ressources que j'ai fournies ne sont pas très complètes.

Si les tâches sont très complexes et que vous ne voulez pas charger d'assemblys sur SQL Server ou si vous n'aimez pas leur système de planification, je vous conseillerais un service Windows .NET avec un plugin de planificateur tiers. Personnellement, si tout le code pouvait être conservé dans une procédure stockée ou une série de procédures stockées, je créerais un travail, car je pense que c'est beaucoup plus facile à gérer et qu'une grande partie du travail a déjà été effectuée pour vous.

Modifier

Je viens de remarquer un commentaire expliquant la granularité. Si vous devez effectuer certaines actions toutes les minutes, une solution de service .NET sera probablement plus facile, car vous devrez probablement implémenter une sorte de solution multithread.

Vous allez avoir besoin d’un planificateur d’emploi et d’un gestionnaire d’emplois car vous avez une faible granularité et vous devez savoir a priori si tous les travaux qui se produisent à une minute donnée se termineront à la minute suivante.

Cela facilite la tâche du planificateur. Vous devriez avoir une table de base de données qui stocke vos travaux et chaque minute un service de planificateur de travaux doit y accéder et sélectionner les travaux à exécuter.

Il mettra ces travaux en file d'attente auprès d'un gestionnaire de travaux. Vous pouvez utiliser une autre table ou une file d'attente transactionnelle pour mettre votre travail en file d'attente. Votre service de gestion des travaux surveillera la file d'attente des travaux. Vous pouvez utiliser votre propre BizTalk pour surveiller la file d'attente des travaux et Lancez une orchestration ou un flux de travail . Il va extraire les tâches une par une, les exécuter et mettre à jour le statut du travail dans la base de données.

Votre problème sera l’évolutivité en fonction du nombre d’utilisateurs, du nombre de tâches qu’ils mettent en file d’attente et de l’intensité de leur utilisation (temps, mémoire, processeur, etc.). Si j'étais vous, je repousserais la granularité d'une minute et la pousserais à 5 minutes. Qu'as-tu besoin de faire à 13h38? que vous ne pouvez pas attendre jusqu'à 13h40 pour? :)

Ceci est déjà un problème discuté sur StackOverflow. veuillez consulter Besoin d'un planificateur de tâches dans asp.net

Vous avez oublié d'ajouter l'information essentielle dans votre question - ASP.Net

Il décrit un cadre de planification pour les applications Web ASp.Net qui peut fonctionner comme un service et vous donner une méthode appelée périodiquement. Vous pouvez ensuite activer votre logique pour charger des événements et mettre en file d'attente les événements valides à l'aide de minuteries.

En outre, celle-ci est la moins chère de toutes les alternatives. J'espère que c'est ce dont vous aviez besoin.

Cela dépend un peu de la nature du système. Partant de l’hypothèse que la définition complète des événements est stockée dans la base de données:

  • Si l'événement doit générer un incident dans une interface utilisateur Web, dans les mises à jour, recherchez dans le tableau les entrées ayant eu lieu et ajoutez les indicateurs / écrans / fenêtres visuels appropriés à la prochaine sortie de la demande Web.
  • Si vos événements sont liés au traitement en arrière-plan, la solution la plus simple consiste à écrire une application .NET autonome indépendante qui interroge le tableau des événements de la base de données à la recherche de nouveaux enregistrements et effectue une vérification à l'horloge pour voir quels événements se sont produits. Vous pouvez vous en sortir et impliquer des threads si certains événements entraînent des processus longs, etc., mais ce serait la conception de base. (N'utilisez le thread que si vous devez ... une application simple monofil qui interroge la table serait plus robuste)
  

Ensuite, je suppose que je vais ajouter un événement / travail quelque part, qui contiendra la clé primaire de la table de base de données. lorsque l'événement doit être déclenché, je vais récupérer cette information de la base de données, puis faire la logique.

Je ne sais pas quelle est la solution commune, mais, en réinventant la roue, je penserais à créer un index de base de données en cluster sur l'heure des événements, afin de pouvoir interroger la base de données à chaque minute avec une instruction du type <

SELECT * FROM Events WHERE Events.Time < next_minute
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top