Conversations de boîte de dialogue

S’applique à :SQL ServerAzure SQL Managed Instance

Tous les messages envoyés par Service Broker font partie intégrante d'une conversation. Un dialogue est une conversation entre deux services. Un dialogue est un flux de messages bidirectionnel permanent et sûr entre deux services.

Les dialogues assurent la remise de messages EOIO (Exactly-Once In-Order Delivery). Ils utilisent l'identificateur de conversation et le numéro de séquence contenus dans chaque message pour identifier les messages apparentés et les livrer dans l'ordre correct. Un dialogue est un flux de messages permanent et sûr entre deux services.

Une conversation de dialogue sous-entend deux participants. L'initiateur lance la conversation. La cible accepte la conversation entamée par l'initiateur. Le fait qu'un participant lance une conversation détermine les messages qu'il peut envoyer, comme spécifié dans le contrat de la conversation. Le schéma suivant illustre le flux de messages d'un dialogue :

Diagramme du flux de messages entre l’initiateur et la cible.

Les applications échangent des messages dans le cadre d'un dialogue. Un message destiné à un dialogue qui est reçu par SQL Server est placé dans la file d'attente de ce dialogue. L'application reçoit donc le message par le biais de la file d'attente et traite le message comme il se doit. Au cours de ce traitement, l'application peut envoyer des messages à l'autre participant du dialogue.

Livraison fiable

Les boîtes de dialogue incorporent des accusés de réception automatiques de réception de messages pour garantir une livraison fiable. Service Broker conserve chaque message sortant dans la file d'attente de transmission jusqu'à ce que le service distant en accuse réception. Ces accusés de réception automatiques économisent temps et ressources car la notification formelle d'arrivée de chaque message qui est effectuée par les applications n'est plus nécessaire. Chaque fois que cela est possible, les messages d'accusés de réception sont intégrés dans les messages de retour du dialogue.

Notes

Service Broker gère les messages d’accusés de réception en interne. Ces messages n’apparaissent pas dans une file d’attente et ne sont pas remis à l’application. Service Broker ne considère pas qu’il s’agit d’une erreur pour qu’un service distant devienne inaccessible. Ainsi, lorsqu'un service distant ne peut être joint, Service Broker conserve les messages destinés à ce service jusqu'à ce qu'il soit de nouveau disponible ou que la durée de vie du dialogue ait expiré.

Durée de vie de la boîte de dialogue

Les applications peuvent échanger des messages le temps que dure le dialogue. La durée de vie d'un dialogue s'étend entre le moment où l'instance SQL Server locale crée le dialogue et celui où une application met fin à ce dialogue de façon explicite ou reçoit un message d'erreur associé au dialogue. Chaque participant doit conclure officiellement la conversation lorsque l'application reçoit un message signalant une erreur ou la fin de la conversation. Dans la plupart des services, un participant est chargé de signaler la fin d'une conversation réussie en achevant la conversation sans produire d'erreur. Que cela soit effectué par la cible ou l’initiateur dépend de l’objectif de la conversation.

Au niveau local, Service Broker crée un point de terminaison de conversation pour le dialogue que l'application a entamé à l'origine. Le Service Broker local crée également un point de terminaison de conversation pour l'application cible, lorsque l'instance reçoit le premier message du dialogue.

Les dialogues peuvent également garantir que la durée de vie d’une conversation ne dépasse pas une limite spécifiée. Ainsi, l'application sollicitant le dialogue peut éventuellement indiquer une durée de vie maximale pour ce dialogue. Le Service Broker local et le Service Broker distant suive sa durée de vie. Lorsqu’un dialogue reste actif pendant la durée de vie maximale, chaque côté de la conversation place un message d’erreur de délai d’attente dans la file d’attente du service et refuse les nouveaux messages pour la boîte de dialogue. Les conversations ne vivent jamais au-delà de la durée de vie maximale établie au démarrage de la boîte de dialogue. Bien qu’une application puisse toujours recevoir des messages pour la conversation après la fin de la conversation, aucun nouveau message ne peut arriver pour cette conversation. L’application ne peut pas envoyer de messages sur la conversation.

Les applications sont chargées d’indiquer quand elles sont terminées avec une boîte de dialogue en terminant explicitement la boîte de dialogue. Service Broker n'achève jamais un dialogue automatiquement, celui-ci demeure dans la base de données jusqu'à ce que l'application mette explicitement un terme à la conversation. Par conséquent, même lorsque la boîte de dialogue expire ou que le répartiteur signale une erreur, chaque participant à la conversation doit émettre explicitement l’instruction END CONVERSATION .

Minuteur de conversation

Un minuteur de conversation permet à une application de recevoir un message à un moment précis. Lorsque le minuteur de conversation expire, SQL Server insère un message pour la conversation dans la file d’attente de la conversation au niveau du point de terminaison qui a démarré le minuteur de conversation. L'utilisation d'un minuteur de conversation par une application est infinie : il sert habituellement à répondre aux retards des réponses provenant du service distant. Une autre utilisation courante consiste à créer un service qui envoie des messages à intervalles réguliers au service distant. Un service peut, par exemple, utiliser un minuteur de conversation pour donner des informations sur l'état de SQL Server toutes les deux ou trois minutes. Des applications peuvent également utiliser ce minuteur pour une procédure stockée à un moment donné. Service Broker est donc en mesure de prendre en charge des activités planifiées.

Chaque participant engagé dans une conversation peut définir un minuteur par conversation. Le minuteur de conversation n’est pas partagé avec l’autre participant et le minuteur de conversation n’affecte pas la durée de vie de la conversation. Au lieu de cela, lorsque le minuteur expire, le Service Broker local ajoute un message de délai d’expiration à la file d’attente du service local. Un message de délai d’expiration porte le nom du type https://schemas.microsoft.com/SQL/ServiceBroker/DialogTimer