Priorités de conversation

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.

Utilisation 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 et points de terminaison de la conversation

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), 5 étant la valeur par défaut.

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

    • Un nom de contrat, ou ANY.

    • Un nom de 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 la conversation 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 la 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 :

    • Envoi à partir du service de l'initiateur.

    • Réception dans 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 conversation de la cible associe l'autre côté de la conversation au service 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éception dans la file d'attente de la cible.

    • Envoi à partir du service de la cible.

    • Obtention du groupe de conversations suivant à partir de la file d'attente de la 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.

Mode d'assignation des niveaux de priorité par Service Broker

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

Service Broker assigne au point de terminaison 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 en premier 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 la conversation. S'il n'en trouve pas, Service Broker recherche alors une priorité dont le contrat et le service local correspondent à ceux utilisés par le point de terminaison, et dont le service distant a la valeur 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 de niveaux de priorité entre des points de terminaison de conversation. Service Broker assigne de manière autonome un niveau de priorité à chaque point de terminaison. Pour que Service Broker assigne 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 les priorités de conversation. Si les points de terminaison de la conversation 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 la conversation à l'aide d'une priorité de conversation qui spécifie le nom de contrat utilisé par la conversation et ANY comme nom des services 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 du service de l'initiateur pour LOCAL_SERVICE_NAME et le nom du service de la cible pour REMOTE_SERVICE_NAME.

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

Le même niveau de priorité est normalement spécifié pour les deux points de terminaison d'une conversation. Vous pouvez spécifier différents niveaux de priorité pour chaque point de terminaison, mais cela ne signifie pas que des messages seront envoyés plus rapidement dans un sens ou dans 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'ont pas d'incidence sur le transfert de messages, qui s'effectue toujours avec un niveau de priorité 5 par défaut.

Exemple de priorité de conversation

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

  • InitiatorDB contenant InitiatorService et InitiatorQueue.

  • TargetDB contenant TargetService et TargetQueue.

  • Contrat nommé SimpleContract, qui spécifie que RequestMessages est envoyé de InitiatorService à TargetService. Spécifie également que ReplyMessages est envoyé de 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 :

  • SEND de RequestMessage allant de InitiatorService à TargetQueue.

  • RECEIVE de ReplyMessage à partir de InitiatorQueue.

USE InitiatorDB;
GO
CREATE BROKER PRIORITY InitiatorToTargetPriority
    FOR CONVERSATION
    SET (CONTRACT_NAME = SimpleContract,
         LOCAL_SERVICE_NAME = InitiatorSerivce,
         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 :

  • RECEIVE de RequestMessage à partir de TargetQueue.

  • SEND de ReplyMessage allant de TargetService à InitiatorQueue.

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 général, Service Broker envoie et reçoit les messages des conversations de haute priorité avant d'envoyer et recevoir les messages des conversations de faible priorité. Les messages des conversations de haute priorité passent moins de temps dans les files d'attente que les messages des conversations de faible priorité.

Niveaux de priorité en 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 qui déterminent l'ensemble des messages récupérés par une instruction RECEIVE et l'ordre dans lequel ils le sont :

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

    • Une instruction RECEIVE qui ne contient pas de clause WHERE récupère les messages appartenant au groupe de conversations déverrouillé dont la priorité est la plus élevée et qui a des messages dans la file d'attente.

    • Une instruction RECEIVE qui contient une clause WHERE récupère les messages du groupe de conversations spécifié dans la clause WHERE.

  • Dans un groupe de conversations, l'instruction RECEIVE récupère les messages en fonction du niveau de priorité des conversations dans le 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.

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

Niveaux de priorité en 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 ne sont appliqués aux messages dans la file d'attente de transmission que si l'option de base de données HONOR_BROKER_PRIORITY a la valeur ON. Si HONOR_BROKER_PRIORITY a la valeur OFF, tous les messages placés dans la file d'attente de transmission pour cette base de données sont envoyés avec le niveau de priorité par défaut 5. Lorsqu'il est affiché à l'aide de sys.transmission_queue, le message présente encore le niveau de priorité qu'il a reçu du point de terminaison, mais il est transmis avec le niveau de priorité par défaut.

Comme 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 des 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 fragments de message peuvent être envoyés sans suivre l'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. Si plusieurs fragments de message avec des priorités différentes sont prêts à être envoyés à une instance, Service Broker peut les transmettre en un seul bloc. Certains fragments à la fin du bloc peuvent avoir un niveau de priorité inférieur aux fragments de message attendant d'être transmis à 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 si la file d'attente contient d'autres messages dont la priorité est plus élevée.

Des messages ou fragments de message individuels peuvent être envoyés en ignorant l'ordre de priorité, cela n'a cependant pas beaucoup d'incidences compte tenu du nombre important de messages envoyés.