Priorités de conversation

S’applique à :SQL ServerAzure SQL Managed Instance

Les priorités de conversation constituent un jeu de règles définies par l'utilisateur, dont chacune spécifie un niveau de priorité et les critères pour déterminer les conversations Service Broker auxquelles ce niveau de priorité doit être assigné. Les messages de conversations dont les niveaux de priorité sont élevés sont généralement envoyés ou reçus avant ceux dont les niveaux de priorité sont faibles.

Utilisations des priorités de conversation

Les priorités de conversation permettent d'effectuer les opérations suivantes :

  • Identifier les conversations prioritaires par rapport à d'autres.

  • Prendre en charge différents niveaux de service pour donner la priorité aux messages des clients qui paient les tarifs les plus élevés.

  • Privilégier les demandes des clients par rapport aux tâches en arrière-plan. Par exemple, l'inscription de nouveaux clients doit primer sur l'envoi de relevés de transactions commerciales à un entrepôt de données.

Priorités de conversation et points de terminaison de conversion

Les priorités de conversation sont créées dans chaque base de données à l’aide de l’instruction CREATE BROKER PRIORITY . Chaque priorité de conversation définit les éléments suivants :

  • Un nom pour la priorité de conversation.

  • Un niveau de priorité à assigner aux conversations Service Broker. Les niveaux sont spécifiés sous forme d'entiers de 1 (valeur minimale) à 10 (valeur maximale), La valeur par défaut est 5.

  • Les critères suivants déterminent les conversations auxquelles le niveau de priorité est appliqué :

    • Un nom de contrat ou ANY
    • Nom d’un service local ou ANY
    • Un nom de service distant ou ANY

Service Broker assigne des niveaux de priorité aux points de terminaison de la conversation lors de leur création. Chaque conversation comporte deux points de terminaison :

  • Le point de terminaison de l'initiateur associe un côté de la conversation au service et à la file d'attente de l'initiateur. Le point de terminaison de conversation de l’initiateur est créé lors de l’exécution de l’instruction BEGIN DIALOG . Les opérations suivantes sont associées au point de terminaison de la conversation de l'initiateur :

    • Envois à partir du service initiateur
    • Réceptions de la file d’attente de l’initiateur
    • Obtention du groupe de conversations suivant à partir de la file d’attente de l’initiateur
  • Le point de terminaison de la cible associe l'autre côté de la conversation au service cible et à la file d'attente de la cible. Le point de terminaison de la conversation de la cible est créé lorsque le premier message de l'initiateur est placé dans la file d'attente de la cible. Les opérations suivantes sont associées au point de terminaison de la conversation de la cible :

    • Réceptions de la file d’attente cible
    • Envois à partir du service cible
    • Obtention du groupe de conversations suivant à partir de la file d’attente cible

Le type de point de terminaison de la conversation détermine si le service est évalué comme un service local ou distant :

  • Pour le point de terminaison de la conversation de l'initiateur, le service de l'initiateur est le service local et le service de la cible est le service distant.
  • Pour le point de terminaison de la conversation de la cible, le service de la cible est le service local et le service de l'initiateur est le service distant.

Comment Service Broker affecte des niveaux de priorité

Service Broker assigne des niveaux de priorité de conversation lors de la création des points de terminaison de conversation. Les points de terminaison de la conversation conservent leur niveau de priorité jusqu'à la fin de la conversation. Les nouvelles priorités ou modifications apportées aux priorités existantes ne sont pas appliquées aux conversations existantes.

Service Broker assigne au point de terminaison de la conversation le niveau de la priorité de conversation dont les critères de contrat et de services correspondent le mieux aux propriétés du point de terminaison. Le tableau suivant présente la précédence des correspondances :

Contrat de point de terminaison Service local de point de terminaison Service distant de point de terminaison
Contrat de priorité Service local de priorité Service distant de priorité
Contrat de priorité Service local de priorité ANY
Contrat de priorité ANY Service distant de priorité
Contrat de priorité ANY ANY
ANY Service local de priorité Service distant de priorité
ANY Service local de priorité ANY
ANY ANY Service distant de priorité
ANY ANY ANY

Service Broker recherche d’abord une priorité dont le contrat, le service local et le service distant spécifiés correspondent à ceux utilisés par le point de terminaison de conversation. Si l’un n’est pas trouvé, Service Broker recherche ensuite une priorité avec un contrat et un service local qui correspond à ceux utilisés par le point de terminaison et où le service distant a été spécifié en tant que ANY. Ce processus se poursuit pour toutes les variations répertoriées dans le tableau de priorité. Si aucune correspondance n'est trouvée, le point de terminaison est affecté de la priorité 5 par défaut.

Les protocoles de communication Service Broker ne transmettent pas les niveaux de priorité entre les points de terminaison de conversation. Service Broker attribue indépendamment un niveau de priorité à chaque point de terminaison. Pour que Service Broker attribue des niveaux de priorité aux points de terminaison de la conversation de l'initiateur et de la cible, vous devez vous assurer que les deux points de terminaison sont couverts par des priorités de conversation. Si les points de terminaison de l'initiateur et de la cible se trouvent dans des bases de données distinctes, vous devez créer des priorités de conversation dans chaque base de données. Si les points de terminaison de l'initiateur et de la cible se trouvent dans la même base de données :

  • Vous pouvez couvrir les deux points de terminaison de conversation à l’aide d’une priorité de conversation qui spécifie le nom du contrat utilisé par la conversation et ANY pour les noms de service local et distant.

  • Vous pouvez couvrir chaque point de terminaison de la conversation séparément à l'aide de deux priorités de conversation :

    • Une conversation pour le point de terminaison de l’initiateur qui spécifie le nom LOCAL_SERVICE_NAME du service initiateur et le nom du service cible pour REMOTE_SERVICE_NAME.

    • Une conversation pour le point de terminaison cible qui spécifie le nom du service cible et LOCAL_SERVICE_NAME le nom du service initiateur pour REMOTE_SERVICE_NAME.

Le même niveau de priorité est normalement spécifié pour les deux points de terminaison d'une conversation. Bien que vous puissiez spécifier des niveaux de priorité différents pour chaque point de terminaison, cela ne signifie pas que les messages sont envoyés plus rapidement dans une direction que l’autre. Les messages sont envoyés d'un point de terminaison et reçus à l'autre point de terminaison. Par conséquent, chaque transmission de message est affectée par les niveaux de priorité assignés aux deux points de terminaison. Par exemple, vous pouvez configurer une conversation de manière à affecter le niveau de priorité 10 au point de terminaison de la conversation de l'initiateur et le niveau de priorité 1 au point de terminaison de la cible. Dans ce cas :

  • Les messages transmis à partir du service de l'initiateur avec un niveau de priorité 10 arrivent dans la file d'attente de la cible avec un niveau de priorité 1.

  • Les messages transmis à partir du service de la cible avec un niveau de priorité 1 arrivent dans la file d'attente de l'initiateur avec un niveau de priorité 10.

Un groupe de conversations est affecté du niveau de priorité le plus élevé assigné à une conversation qui répond aux conditions suivantes :

  • La conversation est un membre du groupe.
  • La conversation a actuellement des messages dans la file d'attente de service.

Tous les points de terminaison de la conversation d'une base de données sont affectés de la priorité 5 par défaut si aucune priorité de conversation n'a été créée dans la base de données.

Les priorités de conversation n’affectent pas le transfert de messages, qui fonctionne toujours au niveau de priorité par défaut de 5.

Exemple de priorité de conversation

Imaginons un système présentant les éléments suivants :

  • Contenant InitiatorDB un InitiatorService et InitiatorQueue.

  • Contenant TargetDB un TargetService et TargetQueue.

  • Un contrat nommé SimpleContract, qui spécifie qui RequestMessages sont envoyés du InitiatorService vers le TargetService. Elle spécifie également qu’elles ReplyMessages sont envoyées à partir du TargetService .InitiatorService

Ce script spécifie le niveau de priorité du point de terminaison de la conversation de l'initiateur et de ses opérations associées :

  • Le SEND du de l’au RequestMessageInitiatorServiceTargetQueue
  • Le RECEIVE de la ReplyMessageInitiatorQueue
USE InitiatorDB;
GO

CREATE BROKER PRIORITY InitiatorToTargetPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = InitiatorService,
            REMOTE_SERVICE_NAME = N'TargetService',
            PRIORITY_LEVEL = 3
    );
GO

Ce script spécifie le niveau de priorité du point de terminaison de la conversation de la cible et de ses opérations associées :

  • Le RECEIVE de la RequestMessageTargetQueue
  • Le SEND du de l’au ReplyMessageTargetServiceInitiatorQueue
USE TargetDB;
GO

CREATE BROKER PRIORITY TargetToInitiatorPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = TargetService,
            REMOTE_SERVICE_NAME = N'InitiatorService',
            PRIORITY_LEVEL = 3
    );
GO

Fonctionnement des priorités

En règle générale, Service Broker envoie et reçoit des messages pour les conversations à priorité élevée avant d’envoyer et de recevoir des messages pour les conversations de faible priorité. Les messages provenant de conversations à priorité élevée passent moins de temps dans les files d’attente que les messages provenant de conversations de faible priorité.

Niveaux de priorité de réception

Les niveaux de priorité sont toujours appliqués à des opérations qui reçoivent des messages ou des identificateurs de groupe de conversations d'une file d'attente.

Le niveau de priorité est l’un des facteurs déterminant l’ensemble de messages récupérés par un RECEIVE et la séquence dans laquelle les messages sont récupérés :

  • Chaque RECEIVE instruction récupère toujours les messages d’un groupe de conversations :

    • Une RECEIVE clause qui n’a aucune WHERE clause récupère les messages appartenant au groupe de conversation déverrouillé le plus prioritaire qui contient des messages dans la file d’attente.

    • Une RECEIVE clause qui a une WHERE clause récupère les messages pour le groupe de conversations spécifié dans la WHERE clause.

  • Dans un groupe de conversations, RECEIVE récupère les messages en fonction du niveau de priorité des conversations du groupe. Tous les messages de la conversation avec le niveau de priorité le plus élevé sont récupérés en premier, puis ceux avec le niveau de priorité immédiatement inférieur, et ainsi de suite.

  • Dans une conversation, les messages sont récupérés dans le même ordre qu'ils ont été envoyés.

GET CONVERSATION GROUP retourne le groupe avec le niveau de priorité le plus élevé à partir de l’ensemble de groupes déverrouillés qui ont des messages dans la file d’attente.

Niveaux de priorité de transmission

Les messages dans les files d'attente de transmission d'une instance sont transmis dans un ordre défini selon les critères suivants :

  • Le niveau de priorité du point de terminaison de leur conversation associée.
  • dans un même niveau de priorité, leur ordre d'envoi dans la conversation.

Service Broker coordonne les niveaux de priorité dans toutes les files d'attente de transmission dans une instance du moteur de base de données. Service Broker transmet d'abord les messages des conversations de priorité 10 dans l'ensemble des files d'attente de transmission, puis les messages des conversations de priorité 9, et ainsi de suite.

La différence relative des performances des messages augmente avec l'écart des niveaux de priorité. Dans un système qui utilise deux niveaux de priorité adjacents, tels que 9 et 10, les messages avec le niveau de priorité le plus élevé bénéficient d'un léger avantage en termes de performances. Dans un système qui utilise deux niveaux de priorité largement séparés, tels que 1 et 10, les messages avec le niveau de priorité le plus élevé bénéficient d'un avantage plus important en termes de performances. Dans des systèmes utilisant plusieurs niveaux de priorité, le traitement est majoritairement alloué aux niveaux de priorité supérieurs 2 ou 3.

Les niveaux de priorité spécifiés dans les priorités de conversation sont appliqués uniquement aux messages dans la file d’attente de transmission si l’option HONOR_BROKER_PRIORITY de base de données est définie ONsur . S’il HONOR_BROKER_PRIORITY est défini OFFsur , tous les messages placés dans la file d’attente de transmission pour cette base de données sont envoyés à l’aide du niveau de priorité par défaut de 5. Lorsqu’il est affiché à l’aide sys.transmission_queue, le message affiche toujours le niveau de priorité reçu du point de terminaison, mais le niveau de priorité par défaut est utilisé pour transmettre le message.

Étant donné que les niveaux de priorité sont appliqués aux messages dans la file d’attente de transmission, ils n’affectent généralement pas les messages envoyés entre les services dans la même instance du moteur de base de données. Les messages envoyés à un service dans la même instance sont placés directement dans la file d'attente du service sans passer par une file d'attente de transmission. Sous certaines conditions, des messages locaux peuvent être placés dans la file d'attente de transmission, par exemple lorsque certains types d'erreurs surviennent ou que la file d'attente de destination est inactive. Si le message est stocké dans la file d'attente de transmission, le niveau de priorité pertinent est appliqué.

Les messages et les fragments de message peuvent être envoyés hors ordre de priorité :

  • Service Broker envoie des messages entre des instances du moteur de base de données à l'aide de blocs de fragments de message. S’il existe plusieurs fragments de message avec des priorités différentes prêtes à être envoyées à une instance, Service Broker peut envoyer tous les fragments d’un bloc. Certains fragments à la fin du bloc peuvent avoir un niveau de priorité inférieur à celui des fragments de message en attente de transmission vers une autre instance.

  • Service Broker inclut un mécanisme de prévention de la privation pour empêcher les nombreux messages de haute priorité de bloquer les messages de faible priorité. Un message de faible priorité qui attend depuis longtemps peut être envoyé même s’il existe des messages de priorité plus élevée dans la file d’attente.

Même si des messages individuels ou des fragments de message peuvent être envoyés hors ordre de priorité, les effets doivent être petits lorsqu’ils sont pris en compte dans de nombreux messages envoyés.