Compartilhar via


Compreendendo quando ocorre a ativação

O processo de ativação do Service Broker consiste em duas etapas. Primeiro, o Service Broker determina se ativação é necessária. Segundo, o Service Broker determina se ativação ocorrerá. Embora o processo exato seja diferente para ativação interna e externa, os conceitos gerais envolvidos são o mesmo para qualquer estratégia.

Determinando se a ativação é necessária

A ativação será necessária sempre que um novo leitor de fila tiver trabalho útil para executar. Os monitores da fila determinam se a ativação é necessária. O Service Broker cria um monitor de fila para cada fila com a ativação STATUS = ON ou para o qual uma notificação de evento QUEUE_ACTIVATION tenha sido registrada. A exibição gerenciamento dinâmico sys.dm_broker_queue_monitors (Transact-SQL) lista os monitores de fila ativos na instância. Cada monitor de fila localiza o seguinte:

Se a fila contém mensagens que estão prontas para receber

Há quanto tempo uma instrução RECEIVE na fila retornou um conjunto de resultados vazio

Quantos procedimentos armazenados de ativação estão sendo executados atualmente para a fila.

Um monitor de fila verifica se a ativação é necessária freqüentemente e quando um ou mais dos eventos a seguir ocorre:

  • Uma nova mensagem chega na fila.

  • O SQL Server executa uma instrução RECEIVE para a fila.

  • Uma transação que contém uma instrução RECEIVE é revertida.

  • Todos os procedimentos armazenados iniciados pelo monitor da fila são encerrados.

  • O SQL Server executa uma instrução ALTER para a fila.

A ativação será necessária se qualquer um dos itens a seguir for aplicável:

  • Uma nova mensagem chega em uma fila que não contém nenhuma mensagem não lida e não há nenhum procedimento armazenado de ativação em execução para a fila.

  • A fila contém mensagens não lidas, não há sessão aguardando em uma instrução GET CONVERSATION GROUP ou uma instrução RECEIVE sem uma cláusula WHERE e nenhuma instrução GET CONVERSATION GROUP ou instrução RECEIVE sem uma cláusula WHERE tenha retornado um conjunto de resultados vazio por alguns segundos. Em outras palavras, quando as mensagens estão se acumulando na fila porque os procedimentos ativos não podem lê-las rápido o bastante.

Na verdade, esse procedimento permite que o monitor da fila informe se o número de leitores de fila processando a fila está acompanhando o tráfego de mensagem de entrada. Note que essa abordagem leva em conta o bloqueio de grupo de conversação. Como somente um leitor de fila de cada vez pode processar mensagens para uma conversação, iniciar os leitores de fila em resposta a uma abordagem mais simples, como o número de mensagens não lidas na fila, pode desperdiçar recursos. Em vez disso, a ativação do Service Broker considera se um novo leitor de fila terá trabalho útil para executar.

Por exemplo, uma fila pode conter um número grande de mensagens não processadas em uma única conversação. Nesse caso, somente um leitor de fila pode processar as mensagens. O monitor de fila ativa outro leitor de fila. O segundo leitor de fila aguarda a instrução RECEIVE, desde que todas as mensagens pertençam a uma única conversação. Desde que todas as mensagens da fila pertençam a mesma conversação e o segundo leitor de fila permaneça em execução, o monitor da fila não iniciará outro leitor de fila.

Determinando se ativação ocorre

Quando o Service Broker determina que a ativação é necessária, o Service Broker devem decidir se ativação ocorrerá.

Para ativação interna, o monitor da fila ativa uma nova instância do procedimento armazenado da ativação quando o número de programas em execução é inferior ao valor MAX_QUEUE_READERS definido para a fila. Se o número dos programas em execução for igual ou maior que o valor MAX_QUEUE_READERS, o monitor da fila não iniciará uma nova instância do procedimento armazenado. A exibição do gerenciamento sys.dm_broker_activated_tasks (Transact-SQL) contém informações sobre os procedimentos armazenados iniciados pelo Service Broker.

Para os aplicativos externos, o Service Broker não tem nenhuma informação sobre o número de leitores de fila distintos que podem estar funcionando com a fila. Além disso, pode ocorrer a exigência de algum tempo de inicialização entre o tempo que o evento de ativação é gerado e o tempo que o leitor começa a leitura da fila. Portanto, o Service Broker fornece um tempo limite para um aplicativo externo responder. Durante o tempo limite, o Service Broker não gerará outra notificação. Quando um aplicativo chama RECEIVE na fila ou o tempo limite expirar, o Service Broker criará outra notificação de eventos se a ativação for requerida. Um aplicativo externo monitora as notificações de eventos enquanto o programa estiver executando para determinar se mais leitores de fila são exigidos ler os eventos.