Présentation du contexte de mise en œuvre de l'activation

Le processus d'activation Service Broker comporte deux étapes. En premier lieu, Service Broker détermine si l'activation est nécessaire. Ensuite, Service Broker détermine si l'activation se produit. Bien que le processus précis diffère pour l'activation interne et l'activation externe, les concepts généraux sont identiques pour les deux stratégies.

Détermination de la nécessité de l'activation

L'activation est nécessaire chaque fois qu'un nouvel agent de lecture de file d'attente doit véritablement effectuer des opérations. Les moniteurs de file d'attente déterminent si l'activation est nécessaire. Service Broker crée un moniteur de file d'attente pour chaque file d'attente dont l'état d'activation est Activé (STATUS = ON) ou pour laquelle une notification d'événement QUEUE_ACTIVATION a été enregistrée. La vue de gestion dynamique sys.dm_broker_queue_monitors (Transact-SQL) répertorie les moniteurs de file d'attente actifs dans l'instance. Chaque moniteur de file d'attente assure le suivi des éléments suivants :

détermine si la file d'attente contient des messages prêts à être traités ;

identifie depuis combien de temps une instruction RECEIVE dans la file d'attente n'a pas retourné un jeu de résultats vide  ;

détermine le nombre de procédures stockées d'activation en cours d'exécution pour la file d'attente.

Un moniteur de file d'attente vérifie toutes les deux ou trois secondes si l'activation est nécessaire et également lorsqu'un ou plusieurs des événements suivants se produisent :

  • Un nouveau message arrive dans la file d'attente.

  • SQL Server exécute une instruction RECEIVE pour la file d'attente.

  • Une transaction contenant une instruction RECEIVE est restaurée.

  • Toutes les procédures stockées démarrées par le moniteur de file d'attente se terminent.

  • SQL Server exécute une instruction ALTER pour la file d'attente.

L'activation est nécessaire dans l'une des circonstances suivantes :

  • Un nouveau message arrive dans une file d'attente qui ne contient pas de message non lu, et aucune procédure stockée d'activation n'est en cours d'exécution pour la file d'attente.

  • La file d'attente contient des messages non lus, il n'y a pas de session en état d'attente dans une instruction GET CONVERSATION GROUP ou une instruction RECEIVE sans clause WHERE, et aucune instruction GET CONVERSATION GROUP ou RECEIVE sans clause WHERE n'a retourné un jeu de résultats vide depuis plusieurs secondes ; en d'autres termes, lorsque les messages s'accumulent dans la file d'attente car les procédures activées ne sont pas en mesure de les lire assez rapidement.

En fait, cette procédure permet au moniteur de file d'attente de déterminer si le nombre d'agents de lecture de file d'attente traitant la file d'attente peut gérer le volume de messages entrants. Notez que cette approche prend en compte le verrouillage des groupes de conversations. Étant donné qu'un seul agent de lecture de file d'attente à la fois peut traiter les messages d'une conversation, le lancement d'agents de lecture en réponse à une approche plus simple (comme le nombre de messages non lus dans la file d'attente) peut gaspiller des ressources. En revanche, l'activation Service Broker vérifie si un nouvel agent de lecture de file d'attente aura des tâches de traitement utiles à effectuer.

Par exemple, une file d'attente peut contenir un grand nombre de messages non traités au sein d'une même conversation. Dans ce cas, un seul agent de lecture de file d'attente peut traiter les messages. Le moniteur de file d'attente active un autre agent de lecture de file d'attente. Le second agent de lecture attend dans l'instruction RECEIVE, étant donné que tous les messages appartiennent à la même conversation. Le moniteur de file d'attente ne lance pas d'autre agent de lecture de file d'attente tant que tous les messages de la file d'attente concernent la même conversation et que le second agent de lecture de file d'attente continue de s'exécuter.

Détermination de la mise en œuvre de l'activation

Une fois que Service Broker a déterminé que l'activation est nécessaire, Service Broker doit décider si l'activation intervient.

Pour l'activation interne, le moniteur de file d'attente active une nouvelle instance de la procédure stockée d'activation lorsque le nombre de programmes en cours d'exécution est inférieur à la valeur MAX_QUEUE_READERS définie pour la file d'attente. Si le nombre de programmes en cours d'exécution est supérieur ou égal à la valeur MAX_QUEUE_READERS, le moniteur de file d'attente ne démarre pas de nouvelle instance de la procédure stockée. La vue de gestion sys.dm_broker_activated_tasks (Transact-SQL) contient des informations sur les procédures stockées lancées par Service Broker.

Pour les applications externes, Service Broker ne dispose d'aucune information sur le nombre d'agents de lecture de file d'attente pouvant être utilisés avec la file d'attente. Qui plus est, un délai de démarrage peut être nécessaire entre le moment où l'événement d'activation est déclenché et le moment où un agent de lecture commence à lire la file d'attente. Par conséquent, Service Broker fournit un délai d'attente pour permettre à une application externe de répondre. Pendant ce laps de temps, Service Broker ne génère aucune autre notification. Une fois qu'une application a appelé RECEIVE sur la file d'attente ou que le délai d'attente a expiré, Service Broker crée une autre notification d'événement si l'activation est requise. Une application externe analyse les notifications d'événements lorsque le programme est en cours d'exécution pour déterminer si d'autres agents de lecture de file d'attente sont nécessaires pour lire les événements.