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çã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.
Consulte também