2009-03-23 3 views
2

Je suis novice dans l'utilisation de SQL Service 2005 Service Broker. J'ai créé des files d'attente et j'ai réussi à faire avancer les conversations, etc. Cependant, je veux en quelque sorte "limiter" les messages, et je ne suis pas sûr de savoir comment procéder.Comment réduire l'inondation d'une file d'attente Service Broker?

Les messages sont envoyés par un processus stocké qui est appelé par une application multi-utilisateur. Supposons que 20 utilisateurs provoquent l'appel de cette proc une fois chacun dans une période de 30 secondes, elle ne doit être envoyée qu'une seule fois. Donc, je pense que j'ai besoin d'un moyen de mon proc pour voir si un message a été envoyé dans les 30 dernières secondes? Y-a-t-il un moyen de faire ça?

Une idée que j'avais était d'envoyer un message à une file d'attente de "réponse" qui indique si le processus d'activation de la file d'attente de demandes a été appelé. Ensuite, dans mon proc stocké (appelé par l'application utilisateur), voir si ce message particulier a été récemment appelé. Le problème est que je ne veux pas que cela gâche la file d'attente de réponse. Peut-on jeter un coup d'œil à une file d'attente (ne pas recevoir) pour voir s'il y a un message dedans?

Ou y a-t-il un moyen plus simple d'accomplir ce que je veux?

Répondre

4

Oui, vous pouvez jeter un coup d'œil à une file d'attente pour voir si un message s'y trouve déjà. Il suffit d'interroger la file d'attente en utilisant SELECT au lieu de RECEIVE et vous pouvez regarder les données.

Un meilleur pari serait d'envoyer les messages et avoir la procédure stockée qui reçoit les messages décider si le message doit être lancé ou non.

J'envoie des centaines de milliers de messages au service de courtier à la fois sans aucun problème de performance. Si vous constatez des problèmes de performances, essayez d'envoyer plus d'un message par conversation car c'est le moyen le plus rapide et le plus simple d'améliorer les performances de Service Broker.

1

Vous ne savez pas si vous pourriez le faire dans SB, mais pourriez-vous simplement avoir une table avec un champ d'horodatage qui a été mis à jour lorsqu'un message est envoyé. Le proc vérifierait un temps différé de> 30sec et enverrait.

Questions connexes