Retenção de mensagens

Aplica-se a:SQL ServerAzure SQL Managed Instance

Quando uma fila especifica a retenção de mensagens, o Service Broker não exclui mensagens da fila até que a conversa termine. Além disso, o Service Broker também copia as mensagens de saída para a fila. Isso permite que o serviço mantenha um registro preciso das mensagens recebidas e enviadas.

A retenção de mensagens permite que você mantenha um registro exato de uma conversa para uma fila enquanto a conversa está ativa. Para aplicativos que exigem auditoria detalhada ou que devem executar transações de compensação quando a conversa falha, isso pode ser mais conveniente do que copiar cada mensagem para uma tabela de estados enquanto a conversa está em andamento.

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

Observação

O uso da retenção de mensagens pode reduzir o desempenho. Você só deve usar essa configuração se o contrato de nível de serviço do aplicativo exigir que o aplicativo mantenha as mensagens exatas enviadas e recebidas. As mensagens em uma fila que estão prontas para serem recebidas têm um status de 1. A RECEIVE instrução retorna mensagens que mostram um status de 1. Depois que a RECEIVE instrução retorna uma mensagem, ela define o status como 0 e deixa a mensagem na fila se a retenção de mensagem estiver ativada. Se a retenção de mensagens estiver desativada, a instrução RECEIVE excluirá a mensagem da fila. Qualquer serviço que use a fila salva 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), bem como adiciona a mensagem à fila de transmissão. Quando a conversa termina, a fila exclui automaticamente todas as mensagens da conversa.

Um aplicativo não pode receber a mesma mensagem duas vezes e um aplicativo não pode receber uma mensagem que foi adicionada à fila como uma mensagem de saída. Para trabalhar com mensagens retidas, use uma SELECT declaração para consultar a fila. Para auditoria, um aplicativo insere as mensagens retidas em uma tabela de auditoria antes de encerrar a conversa. Para compensar transações, uma aplicação normalmente retrocede através das mensagens processadas e desfaz o trabalho para cada mensagem por vez, a fim de que todas as mensagens tenham sido processadas.

Para obter mais informações sobre como usar SELECT instruções para acessar uma fila, consulte Filas de consulta.