Desempenho (Service Broker)

O desempenho de um aplicativo Agente de Serviços é geralmente determinado por dois fatores:

  • O número de mensagens que chegam dentro de um período de tempo especificado.

  • A velocidade com que o aplicativo processa cada mensagem.

Monitorar esses dois fatores é a chave para entender o desempenho do aplicativo.

O Agente de Serviços fornece um conjunto de contadores de desempenho que oferecem informações sobre suas atividades. O Agente de Serviços também registra os erros graves no log de erros SQL Server e no log de eventos do Windows. Para obter mais informações sobre os contadores de desempenho, exibições de gerenciamento dinâmico e eventos de rastreamento para o Agente de Serviços, consulte Monitoramento (Service Broker).

Ajustando um procedimento armazenado do Agente de Serviços

Em grande parte, ajustar um procedimento armazenado que usa o Agente de Serviços não é diferente de ajustar qualquer outro procedimento armazenado. Entretanto, há algumas considerações adicionais.

Primeiramente, use a cláusula WAITFOR. As mensagens raramente chegam em intervalos previsíveis. Mesmo em um serviço no qual as mensagens chegam mais ou menos na mesma taxa que o procedimento armazenado processa as mensagens, pode haver vezes em que não haja mensagens disponíveis. Portanto, o procedimento deve usar uma cláusula WAITFOR com uma instrução RECEIVE ou com uma instrução GET CONVERSATION GROUP. Sem WAITFOR, essas instruções retornam imediatamente quando não há nenhuma mensagem disponível na fila. Dependendo da implementação do procedimento armazenado, o procedimento pode retornar automaticamente pela instrução, consumindo recursos desnecessariamente, ou o procedimento pode sair apenas para ser reativado pouco tempo depois, consumindo mais recursos que se tivesse continuado a ser executado.

Você pode lidar com a imprevisibilidade de tempo usando a cláusula WAITFOR com a instrução RECEIVE ou GET CONVERSATION GROUP. Se seu aplicativo for executado continuamente como um serviço em segundo plano, você não especificará um intervalo de tempo limite na instrução WAITFOR. Se seu aplicativo for ativado pelo Agente de Serviços ou executado como uma tarefa programada, especifique um tempo limite curto, por exemplo, 500 milissegundos. Um aplicativo que usa a instrução WAITFOR lida muito bem com os intervalos imprevisíveis entre as mensagens. Da mesma maneira, um aplicativo ativado que sai após um tempo limite curto não consome recursos quando não há mensagens a serem processadas.

O Agente de Serviços garante que apenas uma instância de um aplicativo por vez possa receber mensagens para conversações que compartilham um identificador de grupo de conversação. Projete seus aplicativos para tirar proveito do bloqueio do grupo de conversação para sincronização. Se seu aplicativo mantiver estados, considere usar o identificador do grupo de conversação para identificar o estado da conversação. Processe várias mensagens para um grupo de conversação na mesma transação. Em geral, porém, processe apenas mensagens para um único grupo de conversação em uma determinada transação. Isso ajuda a assegurar que mais de uma instância do aplicativo possa processar mensagens, mesmo quando o número de grupos de conversação for relativamente pequeno.

Além disso, evite usar a retenção de mensagens. Manter uma tabela de logs separada que salva as informações mais importantes de uma mensagem melhora o desempenho. Use a retenção de mensagens apenas se seu aplicativo exigir as mensagens exatas enviadas e recebidas.

A seguir, encerre as conversações quando a tarefa for concluída. O Agente de Serviços mantém o estado de cada conversação ativa. Apesar da quantidade de estados de uma determinada conversação ser pequena, um aplicativo que não encerra conversações pode sofrer redução de desempenho ao longo do tempo.

Finalmente, mantenha as transações curtas. Por exemplo, se o padrão de conversação para o serviço envolver um grande número de mensagens no mesmo grupo de conversações, limitar o número de mensagens processadas em cada transação pode melhorar a taxa de transferência geral.