Résolution des problèmes de routage et de remise de messages

Cette section regroupe quelques suggestions permettant de corriger les problèmes les plus courants liés au routage et à la remise de messages.

Technique : diagnostic de la remise de messages

Si les messages ne sont pas remis avec succès entre deux services, exécutez l'utilitaire ssbdiagnose afin de générer le rapport d'exécution d'une conversation. Ce rapport affiche toutes les erreurs rencontrées par les opérations de la conversation. En cas de présence d'erreurs, ssbdiagnose analyse également la configuration entre les services et signale tout problème de configuration identifié. Pour plus d'informations, consultez Utilitaire ssbdiagnose.

Problème : les messages demeurent dans la file d'attente de transmission

Assurez-vous que la fonction de remise de messages Service Broker est activée dans la base de données. La colonne is_broker_enabled de l'affichage catalogue sys.databases permet de savoir si l'option de remise de messages est activée, comme illustré dans l'exemple suivant :

SELECT is_broker_enabled FROM sys.databases
WHERE database_id = DB_ID() ;

La remise de messages Service Broker peut être désactivée pour éviter que des messages ne soient acheminés vers la mauvaise base de données. Pour plus d'informations sur la remise de messages Service Broker, consultez Gestion des identités Service Broker. Pour plus d'informations sur l'activation de la remise de messages Service Broker, consultez Procédure : activer la remise de messages Service Broker dans les bases de données (Transact-SQL).

Si la remise de messages Service Broker est active, contrôlez la colonne transmission_status dans l'affichage catalogue sys.transmission_queue à la recherche d'éventuels messages. Les messages d'erreur suivants sont couramment rencontrés :

Message

Description

Aucun itinéraire ne correspond au nom de service de destination pour cette conversation. Créez un itinéraire vers le nom de service de destination pour que les messages de cette conversation soient remis.

Service Broker n'a trouvé aucun itinéraire vers le service spécifié.

Le Service Broker cible est inaccessible.

Service Broker n'a pas pu remettre le message au Service Broker cible.

La couche de transport n'est pas disponible.

Il n'existe aucun point de terminaison Service Broker dans l'instance, ou le démarrage des points de terminaison Service Broker existants a échoué.

La file d'attente cible est désactivée.

L'option STATUS de la file d'attente que le service de destination utilise est définie sur OFF. Service Broker n'ajoute pas de nouveaux messages à une file d'attente dont l'option STATUS est désactivée (OFF).

Une erreur s'est produite lors de la réception des données : '10054(Une connexion existante a dû être fermée par l'hôte distant.)'.

La partie distante de la conversation a accepté la connexion TCP/IP, mais elle a fermé la connexion avant l'envoi d'un message.

(Aucun)

Aucune tentative d'envoi de message n'a été effectuée par Service Broker. Si la colonne enqueue_time indique que le message est depuis longtemps dans la file d'attente, il est possible que la remise de messages Service Broker ne soit pas activée dans la base de données.

Problème : l'itinéraire existe, mais l'état de la transmission n'indique aucun itinéraire pour le service

Les causes les plus communes de ce problème sont les suivantes :

  • L'instruction SEND a créé le message alors qu'il n'existait aucun itinéraire pour remettre le message avec succès.

  • L'itinéraire a ensuite été créé, mais Service Broker n'a pas encore réessayé de renvoyer le message.

Pour plus d'informations sur les nouvelles tentatives, consultez Réseau et routage Service Broker.

Vérifiez que le nom du service spécifié dans le message correspond exactement au nom du service spécifié dans l'itinéraire. Service Broker utilise une comparaison binaire, octet par octet, pour faire correspondre les noms de services. Si un itinéraire qui spécifie le nom du service existe, vous pouvez comparer les noms en exécutant la requête suivante :

SELECT N'No Exact Match' = tq.to_service_name
FROM sys.transmission_queue AS tq
WHERE NOT EXISTS
    (SELECT remote_service_name
     FROM sys.routes AS routes
     WHERE tq.to_service_name = routes.remote_service_name) ;

Notes

Certains noms de services peuvent apparaître dans le jeu de résultats bien qu'ils ne correspondent à aucun itinéraire. Un itinéraire qui ne spécifie pas de nom de service (remote_service_name = NULL) utilise le nom de service utilisé avec tout message.

Pour plus d'informations sur les itinéraires Service Broker, consultez Routage Service Broker.

Si le message spécifie un identificateur d'instance Service Broker, vérifiez que l'itinéraire précise le même identificateur ou, le cas échéant, n'indique aucun identificateur d'instance Service Broker.

Vérifiez que le délai de l'itinéraire n'a pas expiré. Dans l'affichage catalogue sys.routes, la colonne de la durée de vie renseigne sur la date d'expiration et la durée de l'itinéraire.

Problème : l'état de la transmission signale que le Service Broker cible est inaccessible

La destination a refusé le message. Le nom de service spécifié ne correspond peut-être pas au nom d'un service hébergé par l'instance SQL Server de destination, ou la destination peut ne contenir aucun itinéraire pour le service. Pour résoudre ce problème, vérifiez la configuration du routage et du service pour la destination.

Problème : l'état de la transmission signale une couche de transport non disponible

Vérifiez qu'un point de terminaison Service Broker existe. S'il n'en existe aucun, créez-en un. S'il en existe un, vérifiez que l'état du point de terminaison est STARTED. Pour plus d'informations, consultez Points de terminaison Service Broker. Pour plus d'informations sur la création d'un point de terminaison, consultez Procédure : activer le réseau Service Broker (Transact-SQL).

Problème : l'état de la transmission indique « Une connexion existante a dû être fermée par l'hôte distant »

La sécurité du transport est peut-être mal configurée ou l'adresse TCP/IP de l'itinéraire indique un port utilisé par un autre service que Service Broker.

Notes

Le port spécifié dans l'itinéraire doit correspondre au port utilisé par le point de terminaison Service Broker sur l'instance distante du Moteur de base de données. Service Broker utilise les protocoles de communication Service Broker pour transmettre des messages, pas le protocole TDS (Tabular Data Stream) utilisé pour transmettre des lots et des résultats Transact-SQL. Par conséquent, le port utilisé par un point de terminaison Service Broker diffère du port utilisé pour transmettre Transact-SQL.

Vérifiez la configuration du point de terminaison Service Broker pour vous assurer que les paramètres de sécurité réseau des deux instances sont compatibles. Si le point de terminaison Service Broker d'une instance indique REQUIRED ou ENABLED, le point de terminaison Service Broker de l'autre instance ne peut pas spécifier NONE.

Contrôlez les certificats, les utilisateurs et les autorisations pour la sécurité du transport Service Broker. Pour plus d'informations, consultez Sécurité du transport Service Broker.