Rétention des messages

Lorsqu'une file d'attente spécifie la rétention des messages, Service Broker ne supprime aucun message de la file d'attente tant que la conversation n'est pas terminée. Qui plus est, Service Broker copie également les messages sortants dans la file d'attente. Le service peut ainsi conserver un enregistrement précis des messages entrants et sortants.

La rétention des messages vous permet de disposer d'un enregistrement exact d'une conversation pour une file d'attente alors que la conversation est active. Pour les applications qui nécessitent des données d'audit détaillées ou qui doivent effectuer des transactions de compensation lorsque la conversation échoue, la rétention des messages peut être plus pratique que la copie de chaque message dans une table d'état pendant que la conversation est active.

La rétention des messages entraîne une augmentation du nombre de messages dans la file d'attente pour les conversations actives. Elle accroît également la quantité de travail que SQL Server effectue lors de l'envoi d'un message. Par conséquent, la rétention des messages diminue les performances. L'incidence précise sur les performances dépend des modèles de communication des services qui utilisent la file d'attente. En général, vous devez utiliser la rétention des messages chaque fois que cette option est indispensable au bon fonctionnement d'une application. Si l'application n'a pas besoin d'un enregistrement précis de tous les messages envoyés et reçus au cours de la conversation, la consignation de l'état dans une table d'état peut améliorer les performances. Qui plus est, n'oubliez pas que lorsque la conversation se termine, les messages conservés sont supprimés de la file d'attente. Par conséquent, si vous utilisez la rétention à des fins d'audit, vous devez veiller à copier les messages dans un emplacement de stockage permanent avant de mettre fin à la conversation.

Notes

Le recours à la rétention des messages peut engendrer une diminution des performances. N'utilisez ce paramètre que si le contrat de niveau de service de l'application impose que l'application conserve les messages exacts qui ont été envoyés et reçus.

Les messages en file d'attente qui sont prêts à être reçus ont un état dont la valeur est 1. L'instruction RECEIVE retourne les messages qui indiquent un état égal à 1. Une fois que l'instruction RECEIVE a retourné un message, elle définit l'état à 0 et laisse le message dans la file d'attente si la rétention des messages est activée. Si la rétention des messages est désactivée, l'instruction RECEIVE supprime le message de la file d'attente. Les services qui utilisent la file d'attente enregistrent à la fois les messages entrants et les messages sortants. Dans ce cas, la commande SEND copie les messages dans la file d'attente du service (valeur 3 pour l'état) et ajoute également le message à la file d'attente de transmission. Lorsque la conversation se termine, la file d'attente supprime tous les messages de la conversation.

Une application ne peut pas recevoir le même message deux fois, ni recevoir un message ayant été préalablement ajouté comme message sortant dans la file d'attente. Pour manipuler les messages conservés, vous devez utiliser une instruction SELECT pour interroger la file d'attente. Pour les opérations d'audit, une application insère les messages conservés dans une table d'audit avant de mettre fin à la conversation. En règle générale, pour les transactions de compensation, une application reprend tous les messages traités en suivant l'ordre inverse du traitement, et elle annule l'opération effectuée pour chaque message, jusqu'à ce que tous les messages aient été traités.

Pour plus d'informations sur l'utilisation d'une instruction SELECT pour accéder à une file d'attente, consultez Interrogation des files d'attente.