Compartilhar via


Retenção de mensagem

Quando uma fila especificar a retenção de mensagem, o Service Broker não excluirá mensagens da fila até que a conversação termine. Além disso, o Service Broker também copia mensagens de saída para a fila. Isso permite que o serviço mantenha um registro preciso das mensagens de entrada e saída.

A retenção de mensagem permite que você mantenha um registro exato de uma conversação para uma fila enquanto a conversação estiver ativa. Para os aplicativos que requerem auditoria detalhada ou que tenham que executar transações de compensação quando a conversação falhar, isso poderá ser mais conveniente que copiar cada mensagem para uma tabela de estado enquanto a conversação estiver em andamento.

A retenção de mensagem aumenta o número de mensagens na fila para conversações ativas e aumenta a quantidade de trabalho que o SQL Server executa durante o envio de uma mensagem. Portanto, a retenção de mensagem reduz o desempenho. O impacto de desempenho exato depende dos padrões de comunicação para os serviços que usam a fila. Em geral, você deve usar a retenção de mensagem quando ela for exigida para um aplicativo operar corretamente. Se o aplicativo não exigir um registro exato de todas as mensagens de enviadas e recebidas enquanto a conversação estiver ativa, manter o estado em uma tabela de estado pode aumentar o desempenho. Lembre-se também que quando a conversação termina, as mensagens retidas são removidas da fila, portanto, se você estiver usando a retenção para fins de auditoria, deverá assegurar-se de copiar as mensagens para um armazenamento permanente antes de terminar a conversação.

ObservaçãoObservação

O uso de retenção de mensagem pode reduzir o desempenho. Essa configuração deverá ser usada somente se o contrato de nível de serviço do aplicativo exigir que o aplicativo retenha as mensagens exatas enviadas e recebidas.

As mensagens de uma fila que estiverem prontas para ser recebidas têm o status 1. A instrução RECEIVE retorna mensagens que mostram o status 1. Depois que a instrução RECEIVE retorna uma mensagem, ela define o status para 0 e abandona a mensagem na fila se a retenção de mensagem estiver ativada. Se a retenção de mensagem estiver desativada, a função RECEIVE excluirá a mensagem da fila. Qualquer serviço que usa a fila salva as mensagens de entrada e saída. Nesse caso, o comando SEND copia as mensagens para a fila do serviço (com um status de 3) e adiciona a mensagem à fila de transmissão. Quando a conversação termina, a fila exclui todas as mensagens para a conversação.

Um aplicativo não pode receber a mesma mensagem duas vezes e também não pode receber uma mensagem que foi adicionada à fila como uma mensagem de saída. Para trabalhar com mensagens retidas, você usa uma instrução SELECT para consultar a fila. Para auditar, um aplicativo insira as mensagens retidas em uma tabela de auditoria antes de terminar a conversação. Para as transações de compensação, um aplicativo normalmente trabalha retroativamente com mensagens processadas e desfaz o trabalho para cada mensagem em turnos até todas as mensagens terem sido processadas.

Para obter mais informações sobre como usar as instruções SELECT para acessar uma fila, consulte Consultando filas.