Compreender quando ocorre a ativação

Aplica-se a:SQL ServerAzure SQL Managed Instance

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

Determinar se a ativação é necessária

A ativação é necessária sempre que um novo leitor de filas tiver trabalho útil para executar. Os monitores de fila determinam se a ativação é necessária. O Service Broker cria um monitor de fila para cada fila com ativação STATUS = ON ou para a qual uma notificação de evento foi registada. O modo de exibição de gerenciamento dinâmico sys.dm_broker_queue_monitors apresenta uma lista dos monitores de fila ativos na instância.

Cada monitor de fila rastreia os seguintes critérios:

  • Se a fila contém mensagens que estão prontas para receber
  • Quão recentemente uma RECEIVE instrução na fila retornou um conjunto de resultados vazio
  • Quantos procedimentos armazenados de ativação estão atualmente em execução para a fila

Um monitor de fila verifica se a ativação é necessária a cada poucos segundos e quando ocorre um ou mais dos seguintes eventos:

  • Uma nova mensagem chega na fila
  • O SQL Server executa uma RECEIVE instrução para a fila
  • Uma transação que contém uma instrução RECEIVE reverte
  • Todos os procedimentos armazenados iniciados pela saída do monitor de fila
  • O SQL Server executa a instrução ALTER para a fila

A ativação é necessária se uma das seguintes condições for verdadeira:

  • Uma nova mensagem chega em uma fila que não contém mensagens não lidas e não há procedimentos armazenados de ativação em execução para a fila.

  • A fila contém mensagens não lidas, não existe sessão a aguardar numa instrução GET CONVERSATION GROUP ou numa instrução RECEIVE sem uma cláusula WHERE, e nenhuma instrução GET CONVERSATION GROUP ou instrução RECEIVE sem uma cláusula WHERE devolveu um conjunto de resultados vazio por alguns segundos. Em outras palavras, quando as mensagens estão se acumulando na fila porque os procedimentos ativados não são capazes de lê-las rápido o suficiente.

Na verdade, esse procedimento permite que o monitor de fila diga se o número de leitores de fila que processam a fila está acompanhando o tráfego de mensagens de entrada. Essa abordagem leva em conta o bloqueio do grupo de conversação. Como apenas um leitor de fila por vez pode processar mensagens para uma conversa, iniciar 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 filas tem trabalho útil a fazer.

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

Determinar se a ativação ocorre

Depois de o Service Broker determinar que a ativação é necessária, deve decidir se esta ocorre.

Para ativação interna, o monitor de fila ativa uma nova instância do procedimento armazenado de ativação quando o número de programas em execução é menor do que o MAX_QUEUE_READERS valor definido para a fila. Se o número de programas em execução for igual ou maior que o MAX_QUEUE_READERS valor, o monitor de fila não iniciará uma nova instância do procedimento armazenado. A vista de gestão sys.dm_broker_activated_tasks contém informações sobre procedimentos armazenados iniciados pelo Service Broker.

Para aplicativos externos, o Service Broker não tem informações sobre o número de leitores de fila distintos que podem estar trabalhando com a fila. Além disso, pode haver algum tempo de inicialização necessário entre o momento em que o evento de ativação é gerado e o momento em que um leitor começa a ler a fila. Portanto, o Service Broker fornece um tempo limite para um aplicativo externo responder. Durante o tempo limite, o Service Broker não produz outra notificação. Depois que um aplicativo chama RECEIVE na fila ou o tempo limite termina, o Service Broker cria outra notificação de evento se a ativação for necessária. Um aplicativo externo monitora as notificações de eventos enquanto o programa está em execução para determinar se mais leitores de fila são necessários para ler eventos.