Retención de mensajes

Se aplica a:SQL ServerAzure SQL Managed Instance

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 la conversación está activa, mantener el estado en una tabla de estado podría mejorar el rendimiento. Recuerde también que cuando finaliza la conversación, los mensajes retenidos se quitan de la cola, por lo que si usa la retención para fines de auditoría, debe asegurarse de copiar los mensajes en almacenamiento permanente antes de finalizar la conversación.

Nota:

La utilización de la retención de mensajes puede reducir el rendimiento. Solo debe usar esta configuración si el contrato de nivel de servicio de la aplicación requiere que la aplicación conserve los mensajes exactos enviados y recibidos. Los mensajes de una cola que están listos para recibirse tienen el estado 1. La RECEIVE instrucción devuelve mensajes que muestran un estado de 1. Después de que la RECEIVE instrucción devuelva 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 RECEIVE instrucción elimina el mensaje de la cola. Cualquier servicio que utilice la cola guarda los mensajes de entrada y de salida. En este caso, el comando SEND copia los mensajes en la cola del servicio (con un status 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 el mismo mensaje dos veces y una aplicación no puede recibir un mensaje que se agregó a la cola como un mensaje saliente. Para trabajar con mensajes retenidos, use una SELECT declaración 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 el uso de SELECT expresiones para acceder a una cola, consulte Consultar colas.