Retención de mensajes

Cuando una cola especifica la retención de mensajes, Service Broker no elimina los mensajes de la cola hasta que finaliza la conversación. Además, Service Broker también copia los mensajes salientes en la cola. Esto permite al servicio mantener un registro preciso de los mensajes de entrada y de salida.

La retención de mensajes le permite mantener un registro exacto de una conversación para una cola mientras la conversación está activa. Para las aplicaciones que requieren una auditoría detallada o que deben realizar transacciones compensatorias cuando se produce un error en la conversación, esto puede ser más conveniente que copiar cada mensaje en una tabla de estado mientras la conversación está en curso.

La retención de mensajes aumenta el número de mensajes en la cola para las conversaciones activas y aumenta la cantidad de trabajo que SQL Server realiza al enviar un mensaje. Por tanto, la retención de mensajes reduce el rendimiento. El impacto exacto en el rendimiento depende de los modelos de comunicación de los servicios que utilizan la cola. En general, debería utilizar la retención de mensajes en cualquier momento en que se requiere la retención del mensaje para que una aplicación funcione correctamente. Si la aplicación no requiere un registro exacto de todos los mensajes enviados y recibidos mientras que la conversación está activa, el mantenimiento del estado en una tabla de estado puede mejorar el rendimiento. También recuerde que cuando la conversación finaliza, los mensajes retenidos se quitan de la cola, por lo que si está utilizando la retención para propósitos de auditoría, debe asegurarse de copiar los mensajes en el almacenamiento permanente antes de finalizar la conversación.

[!NOTA]

La utilización de la retención de mensajes puede reducir el rendimiento. Este valor se debería utilizar sólo si el contrato del nivel del servicio de la aplicación requiere que la aplicación mantenga los mensajes exactos enviados y recibidos.

Los mensajes de una cola que están listos para ser recibidos tienen el estado 1. La instrucción RECEIVE devuelve los mensajes que muestran el estado 1. Cuando la instrucción RECEIVE devuelve un mensaje, establece el estado en 0 y deja el mensaje en la cola si la retención de mensajes está activada. Si la retención de mensajes está desactivada, la instrucción RECEIVE elimina el mensaje de la cola. Cualquier servicio que utilice la cola guarda los mensajes entrantes y salientes. En este caso, el comando SEND copia los mensajes en la cola para el servicio (con un estado de 3) y agrega el mensaje a la cola de transmisión. Cuando la conversación finaliza, la cola elimina todos los mensajes de la conversación.

Una aplicación no puede recibir dos veces el mismo mensaje y una aplicación no puede recibir ningún mensaje que se agregó a la cola como un mensaje saliente. Para trabajar con mensajes retenidos, utilice una instrucción SELECT para consultar la cola. Para realizar una auditoría, una aplicación inserta los mensajes retenidos en una tabla de auditoría antes de finalizar la conversación. Para compensar las transacciones, una aplicación funciona normalmente hacia atrás a través de los mensajes procesados y deshace el trabajo para cada mensaje, hasta que se hayan procesado todos los mensajes.

Para obtener más información sobre cómo utilizar las instrucciones SELECT para tener acceso a una cola, vea Consultar colas.