2012-04-27 3 views
4

Je crée une architecture basée sur des messages qui utilise actuellement des clients d'interrogation pour récupérer des messages. Pour des raisons évidentes, j'aimerais enregistrer mes clients dans SQL Server 2008 afin de recevoir un événement lorsqu'un message est inséré dans une table.Architecture basée sur les événements SQL Server 2008

J'ai parcouru le Web en faisant des recherches sur SQL Server Message Broker, les procédures stockées CLR et StreamInsight, mais je n'arrive pas à trouver ce que je cherche: un moyen pour SQL Server d'alerter mes services qu'un message a été reçu. Fondamentalement, un modèle axé sur les événements plutôt que sur les sondages.

Est-ce que cela existe? Des idées sur où commencer? Y a-t-il des exemples?

Répondre

3

Oui, cela existe. J'ai eu du succès en utilisant SQL Service Broker. Je ne suis pas familier avec les autres options que vous avez énumérées.

La mise en place de la SSB est pénible car il y a tellement de pièces mobiles et de détails, mais cela fonctionne bien. La partie principale qui vous aide à éviter l'interrogation est une procédure stockée que vous créez et appelez à partir de C#. Dans cette procédure courte est une instruction RECEIVE WAITFOR qui bloque votre connexion ouverte et traitée jusqu'à ce qu'un message est disponible dans votre file d'attente OU vos hits timeout. En C#, que vous obteniez un résultat ou un délai, relancez immédiatement la procédure pour attendre l'élément suivant.

Vous voudrez limiter le nombre de connexions ouvertes que vous avez à SQL ... à 1 si possible. Si vous avez plusieurs parties intéressées, poussez toutes leurs affaires à travers cette seule connexion et distribuez-la avec un serveur C# par d'autres moyens.

+0

Merci beaucoup! J'ai lu sur le RECEIVE WAITFOR, mais j'espérais que je pourrais enregistrer un point de terminaison WCF que je pourrais appeler dans un déclencheur. Je n'aime pas l'idée de bloquer un thread et de garder une connexion DB ouverte. Je pense que je vais juste utiliser un client d'interrogation puisque je vais avoir au moins trois clients différents vérifiant les messages; chacun d'entre eux aura au moins 2 instances sur des machines différentes pour la mise à l'échelle et le basculement. Ceci est une application d'entreprise. Je pourrais utiliser un seul client pour utiliser le RECEIVE WAITFOR, mais un signifie un point de défaillance; ce que je ne veux vraiment pas. – NickV

+0

Eh bien, une connexion ouverte n'est pas si mauvaise. Ce n'est pas une "vraie" chose, et il n'y a pas de trafic dessus en attendant. SQL ne peut pas être déplacé, donc vous êtes laissé avec ceci ou interrogation (comme vous le savez) et l'interrogation est plus de trafic et peut-être plus de connexions ouvertes au cours d'une journée, selon la fréquence de vos événements et la résolution minimale. –

+0

Ça a l'air bien. J'aime le point sur «plus de trafic et peut-être plus de connexions ouvertes au cours de la journée. Je ne m'attends pas à beaucoup de temps d'attente! – NickV