2011-05-19 5 views
6

Je me demande s'il existe un moyen d'utiliser des tâches planifiées avec SQL Azure? Chaque aide est appréciée. Le point est, que je veux courir une déclaration simple et simple de ligne tous les jours et voudrait empêcher mettre en place un rôle de travailleur.Tâches planifiées avec Sql Azure?

+0

Je voudrais aller à http://www.mygreatwindowsazureidea.com/ et voter pour cette fonctionnalité! – ryancrawcour

Répondre

6

Il n'y a pas d'équivalent SQL Agent pour SQL Azure aujourd'hui. Vous devez appeler votre instruction sur une seule ligne à partir d'une tâche en arrière-plan. Toutefois, si vous possédez déjà un rôle Web, vous pouvez facilement générer un thread pour gérer cela dans votre rôle Web sans avoir à créer de rôle de travail. J'ai blogué sur le concept here. Pour générer un thread, vous pouvez le faire dans le gestionnaire d'événement OnStart() (où l'instance de rôle n'est pas encore ajoutée à l'équilibreur de charge) ou dans la méthode Run() (où l'instance de rôle a été ajoutée au chargement) balancier). Habituellement, c'est une bonne idée de faire l'installation dans OnStart(). Une mise en garde peut ne pas être évidente, que vous exécutiez cet appel dans son propre rôle de travail ou dans un thread d'arrière-plan d'un rôle Web existant: Si vous étendez votre rôle à, disons, deux instances, vous devez vous assurer que l'appel quotidien se produit uniquement à partir de l'une des instances (sinon vous pourriez vous retrouver avec des doublons ou une opération potentiellement coûteuse exécutée plusieurs fois). Il existe quelques techniques que vous pouvez utiliser pour éviter cela, comme un verrou de ligne de table ou un bail de blob Azure Storage. Avec le premier, vous pouvez utiliser cette ligne pour stocker l'horodatage de la dernière fois que l'opération a été exécutée. Si vous acquérez le verrou, vous pouvez vérifier si l'opération s'est produite dans une fenêtre de temps définie (peut-être une heure?) Pour décider si l'une des autres instances l'a déjà exécutée. Si vous ne parvenez pas à acquérir le verrou, vous pouvez supposer qu'une autre instance a le verrou et exécute la commande. Il existe d'autres techniques - ce n'est qu'une idée.

+0

Cela semble interessant. – BitKFu

+0

hmmm. mais j'ai seulement un rôle de service de WCF en place. Le rôle de service WCF peut-il être surchargé? – BitKFu

+1

Le terme «rôle» est synonyme de «modèle de machine virtuelle». Tous les rôles Windows Azure correspondent à Windows Server 2008 SP2 ou Windows Server 2008 R2. Et, comme un rôle Web et un rôle de travailleur, le rôle Web WCF a OnStart() et Run(). Vous pouvez exécuter vos tâches d'arrière-plan dans l'un d'eux. –

3

En plus de la réponse de David, si vous avez beaucoup de tâches planifiées à faire alors il pourrait être intéressant de regarder:

(Vous pouvez utiliser quartz.net dans le fil que David a mentionné, mais lokad.cloud nécessiterait un changement d'architecture légèrement plus grand)

+0

+1 pour les frameworks d'ordonnancement préconstruits. L'option Lokad fait partie d'un ensemble de solutions plus vaste pour la création d'applications Windows Azure, et si tout ce dont vous avez besoin est la planification, la solution quartz.net semble être la meilleure solution. –

2

J'espère que c'est acceptable de parler de votre propre entreprise. Nous avons un service basé sur le web qui vous permet de faire cela. Vous pouvez cliquer sur ce lien pour voir plus de détails sur la façon de schedule execution of SQL Azure queries.

+1

J'ai essayé cette solution, c'est génial! – ryancrawcour

2

Pour résoudre le problème des rôles multiples exécutant la même tâche, vous pouvez vérifier l'ID de l'instance de rôle et vous assurer que seule la première instance exécutera la tâche.

using Microsoft.WindowsAzure.ServiceRuntime; 

     String g = RoleEnvironment.CurrentRoleInstance.Id; 
     if (!g.EndsWith("0")) 
     { 
      return; 
     } 
Questions connexes