Résolution des problèmes liés aux priorités de conversation

Cette rubrique fournit des suggestions pour corriger les symptômes les plus courants liés aux priorités de conversation Service Broker.

Technique : déterminer si l'option de base de données HONOR_BROKER_PRIORITY est activée.

Utilisez la colonne sys.databasesis_broker_priority_honored pour déterminer l'état de l'option de base de données HONOR_BROKER_PRIORITY :

SELECT name AS database_name,
       CASE is_broker_priority_honored
            WHEN 0 THEN N'OFF'
            WHEN 1 THEN N'ON'
       END AS is_broker_priority_honored
FROM sys.databases
ORDER BY database_name;

Symptôme : les messages ne sont pas envoyés dans l'ordre de priorité

Ouvrez une trace de SQL Server Profiler et passez en revue les événements Broker Remote Message Ack. La valeur 1 dans la colonne StarvationElevation indique que la priorité des messages a été élevée pour empêcher toute privation. La valeur 0 dans la colonne HonorBokerPriority indique que l'option HONOR_BROKER_PRIORITY n'a pas été activée dans la base de données d'envoi.

Examinez également le compteur du Moniteur système Broker/DBM Transport pour relever les vitesses de transmission des messages avec différents niveaux de priorité.

Symptôme : les messages ne sont pas reçus dans l'ordre de priorité

Une instruction RECEIVE récupère uniquement les messages d'un groupe de conversations. Elle ne reçoit pas les messages provenant de conversations de haute priorité si elles appartiennent à un autre groupe de conversations.

Une instruction RECEIVE qui ne contient pas de clause WHERE récupère les messages provenant du groupe de conversations déverrouillé dont la priorité est la plus élevée. Si le groupe de conversations contient à la fois des conversations de haute priorité et de faible priorité, l'instruction RECEIVE peut récupérer des messages provenant de conversations de faible priorité. Cela peut se produire même si la file d'attente contient des messages provenant de conversations de haute priorité d'autres groupes.

Une instruction RECEIVE qui contient une clause WHERE spécifiant un groupe de conversations récupère uniquement les messages provenant de ce groupe. L'instruction RECEIVE récupère les messages provenant des conversations de faible priorité du groupe indépendamment du niveau de priorité des messages des autres groupes de conversations.

Symptôme : les messages ne sont pas affectés du niveau de priorité prévu

Consultez sys.conversation_endpoint pour vérifier si le niveau de priorité prévu a été assigné au point de terminaison de la conversation. Si ce n'est pas le cas, utilisez sys.conversation_priorites pour comparer les propriétés de conversation spécifiées dans la base de données au contrat, au service local et au service distant utilisés pour le point de terminaison de la conversation.