Comprendre quand l’activation se produit

S’applique à :SQL ServerAzure SQL Managed Instance

Le processus d'activation de Service Broker comprend deux étapes. D'abord, Service Broker détermine si l'activation est nécessaire. Deuxièmement, 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éterminer si l’activation est nécessaire

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 avec activation STATUS = ON ou pour lequel une QUEUE_ACTIVATION notification d’événement a été inscrite. La vue de gestion dynamique sys.dm_broker_queue_monitors répertorie les moniteurs de file d’attente actifs dans l’instance.

Chaque moniteur de file d’attente suit les critères suivants :

  • Indique si la file d’attente contient des messages prêts pour la réception
  • Comment une RECEIVE instruction sur la file d’attente a retourné un jeu de résultats vide
  • 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 RECEIVE instruction pour la file d’attente
  • Une transaction qui contient une RECEIVE instruction est annulée
  • Toutes les procédures stockées démarrées par la sortie du moniteur de file d’attente
  • SQL Server exécute une ALTER instruction pour la file d’attente

L’activation est nécessaire si l’une des conditions suivantes est remplie :

  • 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 attente dans une GET CONVERSATION GROUP instruction ou une RECEIVE instruction sans WHERE clause, et aucune GET CONVERSATION GROUP instruction ou RECEIVE instruction sans WHERE clause n’a renvoyé un jeu de résultats vide pendant quelques secondes. En d’autres termes, lorsque les messages s’accumulent sur la file d’attente, car les procédures activées ne sont pas en mesure de les lire suffisamment 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. Cette approche prend en compte le verrouillage du groupe de conversation. É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. Au lieu de cela, l'activation de Service Broker évalue si un nouveau lecteur de file d'attente a un travail utile à effectuer.

Par exemple, une file d’attente peut contenir un grand nombre de messages non traités sur une seule 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 deuxième lecteur de file d’attente attend dans la déclaration RECEIVE, car tous les messages appartiennent à une seule conversation. Tant que tous les messages de la file d’attente appartiennent à la même conversation et que le deuxième lecteur de file d’attente reste en cours d’exécution, le moniteur de file d’attente ne démarre pas un autre lecteur de file d’attente.

Déterminer si l’activation se produit

Une fois que Service Broker a déterminé que l’activation est nécessaire, il doit décider si l’activation se produit.

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 MAX_QUEUE_READERS valeur définie pour la file d’attente. Si le nombre de programmes en cours d’exécution est égal ou supérieur à la MAX_QUEUE_READERS valeur, le moniteur de file d’attente ne démarre pas une nouvelle instance de la procédure stockée. La vue de gestion sys.dm_broker_activated_tasks contient des informations sur les procédures stockées démarrées par Service Broker.

Pour les applications externes, Service Broker n’a aucune information sur le nombre de lecteurs de file d’attente distincts susceptibles d’utiliser la file d’attente. De plus, il peut y avoir un certain temps de démarrage nécessaire entre le moment où l’événement d’activation est déclenché et l’heure à laquelle un lecteur commence à lire la file d’attente. Par conséquent, Service Broker fournit un délai d’expiration pour qu’une application externe réponde. Pendant le délai d’expiration, Service Broker ne produit pas de nouvelle notification. Une fois qu’une application appelle RECEIVE la file d'attente ou que le délai expire, 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.