Prioridades de conversação

Aplica-se a:SQL ServerAzure SQL Managed Instance

As prioridades de conversação são um conjunto de regras definidas pelo usuário, cada uma das quais especifica um nível de prioridade e os critérios para determinar quais conversas do Service Broker devem ser atribuídas ao nível de prioridade. As mensagens de conversas com altos níveis de prioridade geralmente são enviadas ou recebidas antes de mensagens de conversas com níveis de prioridade baixos.

Usos de prioridades de conversação

As prioridades de conversação podem ser usadas para fazer o seguinte:

  • Identifique conversas que tenham precedência sobre as outras.

  • Ofereça suporte a diferentes níveis de serviço, onde as mensagens de clientes que pagam taxas mais altas são enviadas antes de mensagens de clientes que pagam taxas mais baixas.

  • Privilegie as solicitações dos clientes em detrimento das tarefas em segundo plano. Por exemplo, os registos de novos clientes devem ter uma prioridade mais elevada do que o envio de resumos de transações comerciais para um armazém de dados.

Prioridades de conversação e pontos de extremidade de conversão

As prioridades de conversação são criadas em cada banco de dados usando a CREATE BROKER PRIORITY instrução. Cada prioridade de conversação define o seguinte:

  • Um nome para a prioridade da conversa.

  • Um nível de prioridade para atribuir conversas do Service Broker. Os níveis são especificados como inteiros de 1 (mais baixo) a 10 (mais alto). A predefinição é 5.

  • Os critérios que determinam quais conversas o nível de prioridade se aplica ao seguinte:

    • Um nome de contrato, ou ANY
    • Um nome de serviço local, ou ANY
    • Um nome de serviço remoto ou ANY

O Service Broker atribui os níveis de prioridade aos pontos de extremidade de conversação quando os pontos de extremidade são criados. Cada conversa tem dois pontos de extremidade de conversa:

  • O ponto de extremidade de conversação do iniciador associa um lado da conversa ao serviço do iniciador e à fila do iniciador. O ponto de extremidade de conversação do iniciador é criado quando a BEGIN DIALOG instrução é executada. As operações associadas ao ponto de extremidade de conversação do iniciador incluem o seguinte:

    • Envia do serviço iniciador
    • Recebe da fila do iniciador
    • Obter o próximo grupo de conversação da fila do iniciador
  • O ponto de extremidade de conversação de destino associa o outro lado da conversa ao serviço e à fila de destino. O ponto de extremidade de conversação de destino é criado quando a primeira mensagem do iniciador é colocada na fila de destino. As operações associadas ao ponto de extremidade de conversação de destino incluem o seguinte:

    • Recebe da fila de destino
    • Envia do serviço de destino
    • Obter o próximo grupo de conversação da fila de destino

Qual serviço é avaliado como um serviço local ou remoto depende do tipo de ponto de extremidade de conversa:

  • Para o ponto de extremidade de conversação do iniciador, o serviço do iniciador é o serviço local e o serviço de destino é o serviço remoto.
  • Para o ponto de extremidade de conversação de destino, o serviço de destino é o serviço local e o serviço de iniciador é o serviço remoto.

Como o Service Broker atribui níveis de prioridade

O Service Broker atribui níveis de prioridade de conversação quando os pontos de extremidade de conversação são criados. O ponto de extremidade da conversa mantém o nível de prioridade até que a conversa termine. Novas prioridades ou alterações nas prioridades existentes não são aplicadas às conversas existentes.

O Service Broker atribui ao ponto de extremidade de conversação o nível de prioridade da prioridade de conversa cujos critérios de contrato e serviços melhor correspondem às propriedades do ponto de extremidade. A tabela a seguir mostra a precedência da correspondência:

Contrato de ponto final Serviço Local de Ponto Final Serviço Remoto de Ponto Final
Contrato prioritário Serviço Local Prioritário Serviço remoto prioritário
Contrato prioritário Serviço Local Prioritário ANY
Contrato prioritário ANY Serviço remoto prioritário
Contrato prioritário ANY ANY
ANY Serviço Local Prioritário Serviço remoto prioritário
ANY Serviço Local Prioritário ANY
ANY ANY Serviço remoto prioritário
ANY ANY ANY

O Service Broker primeiro procura uma prioridade cujo contrato especificado, serviço local e serviço remoto correspondam aos usados pelo ponto de extremidade de conversa. Se um não for encontrado, o Service Broker procurará uma prioridade com um contrato e um serviço local que correspondam aos usados pelo ponto de extremidade e onde o serviço remoto foi especificado como ANY. Isso continua para todas as variações listadas na tabela de precedências. Se nenhuma correspondência for encontrada, o ponto de extremidade receberá a prioridade padrão de 5.

Os protocolos de comunicação do Service Broker não transmitem níveis de prioridade entre pontos de extremidade de conversa. O Service Broker atribui independentemente um nível de prioridade a cada ponto de extremidade. Para que o Service Broker atribua níveis de prioridade ao iniciador e aos pontos de extremidade de conversação de destino, você deve garantir que ambos os pontos de extremidade sejam cobertos pelas prioridades de conversa. Se o iniciador e os pontos de extremidade de conversação de destino estiverem em bancos de dados separados, você deverá criar prioridades de conversa em cada banco de dados. Se o iniciador e os pontos de extremidade de destino estiverem no mesmo banco de dados:

  • Você pode cobrir ambos os pontos de extremidade de conversa usando uma prioridade de conversa que especifica o nome do contrato usado pela conversa e ANY para os nomes de serviço local e remoto.

  • Você pode cobrir cada ponto de extremidade de conversa separadamente usando duas prioridades de conversa:

    • Uma conversa para o ponto de extremidade do iniciador que especifica o nome do serviço do iniciador e LOCAL_SERVICE_NAME o nome do serviço de destino para REMOTE_SERVICE_NAME.

    • Uma conversa para o ponto de extremidade de destino que especifica o nome do serviço de destino e LOCAL_SERVICE_NAME o nome do serviço do iniciador para REMOTE_SERVICE_NAME.

O mesmo nível de prioridade geralmente é especificado para ambos os pontos de extremidade de conversação de uma conversa. Embora você possa especificar diferentes níveis de prioridade para cada ponto de extremidade, fazer isso não significa que as mensagens são enviadas mais rapidamente em uma direção do que na outra. As mensagens são enviadas de um ponto de extremidade de conversação e recebidas no outro ponto de extremidade. Portanto, cada transmissão de mensagem é afetada pelos níveis de prioridade atribuídos a ambos os pontos de extremidade. Por exemplo, você pode configurar uma conversa para que o ponto de extremidade de conversa do iniciador tenha nível de prioridade 10 e o ponto de extremidade de destino tenha nível de prioridade 1. Neste caso:

  • As mensagens transmitidas do serviço iniciador usando o nível de prioridade 10 são recebidas da fila de destino usando o nível de prioridade 1.

  • As mensagens transmitidas do serviço de destino usando o nível de prioridade 1 são recebidas da fila do iniciador usando o nível de prioridade 10.

A um grupo de conversação é atribuído o mesmo nível de prioridade que o nível de prioridade mais elevado atribuído a qualquer conversação em que o seguinte se verifique:

  • A conversa é um membro do grupo.
  • A conversa atualmente tem mensagens na fila de atendimento.

Todos os pontos de extremidade de conversação em um banco de dados recebem prioridades padrão de 5 se nenhuma prioridade de conversa tiver sido criada no banco de dados.

As prioridades de conversa não afetam o encaminhamento de mensagens, que sempre opera no nível de prioridade padrão de 5.

Exemplo de prioridade de conversação

Considere um sistema com o seguinte:

  • Um InitiatorDB contendo um InitiatorService e InitiatorQueue.

  • A TargetDB contendo a TargetService e TargetQueue.

  • Um contrato chamado SimpleContract, que especifica que RequestMessages são enviados do InitiatorService para o TargetService. Também especifica que ReplyMessages são enviados do TargetService para o InitiatorService.

Este script especifica o nível de prioridade para o ponto de extremidade de conversação do iniciador e suas operações associadas:

  • O SEND do RequestMessage do InitiatorService para o TargetQueue
  • O RECEIVE do ReplyMessageInitiatorQueue
USE InitiatorDB;
GO

CREATE BROKER PRIORITY InitiatorToTargetPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = InitiatorService,
            REMOTE_SERVICE_NAME = N'TargetService',
            PRIORITY_LEVEL = 3
    );
GO

Este script especifica o nível de prioridade para o ponto de extremidade de conversação de destino e suas operações associadas:

  • O RECEIVE do RequestMessageTargetQueue
  • O SEND do ReplyMessage do TargetService para o InitiatorQueue
USE TargetDB;
GO

CREATE BROKER PRIORITY TargetToInitiatorPriority FOR CONVERSATION
    SET
    (
            CONTRACT_NAME = SimpleContract,
            LOCAL_SERVICE_NAME = TargetService,
            REMOTE_SERVICE_NAME = N'InitiatorService',
            PRIORITY_LEVEL = 3
    );
GO

Como funcionam as prioridades

Normalmente, o Service Broker envia e recebe mensagens para conversas de alta prioridade antes de enviar e receber mensagens para conversas de baixa prioridade. As mensagens de conversas de alta prioridade passam menos tempo em filas do que as mensagens de conversas de baixa prioridade.

Níveis de prioridade de acolhimento

Os níveis de prioridade são sempre aplicados a operações que recebem mensagens ou identificadores de grupo de conversação de uma fila.

O nível de prioridade é um dos fatores que determinam o conjunto de mensagens recuperadas por a RECEIVE e a sequência em que as mensagens são recuperadas:

  • Cada RECEIVE instrução sempre recupera mensagens de um grupo de conversa:

    • A RECEIVE que não WHERE tem cláusula recupera mensagens que pertencem ao grupo de conversação desbloqueado de prioridade mais alta que tem mensagens na fila.

    • A RECEIVE que tem uma WHERE cláusula recupera as mensagens para o grupo de conversação especificado na WHERE cláusula.

  • Dentro de um grupo de conversação, RECEIVE recupera mensagens dependendo do nível de prioridade das conversas no grupo. Todas as mensagens da conversa com o nível de prioridade mais alto são recuperadas primeiro, depois as mensagens da conversa com o próximo nível de prioridade mais alta e assim por diante.

  • Dentro de uma conversa, as mensagens são recuperadas na mesma sequência em que foram enviadas.

GET CONVERSATION GROUP Retorna o grupo com o nível de prioridade mais alto do conjunto de grupos desbloqueados que têm mensagens na fila.

Níveis de prioridade de transmissão

As mensagens nas filas de transmissão de uma instância são transmitidas em sequência com base em:

  • O nível de prioridade do ponto de extremidade de conversação associado.
  • Dentro do nível de prioridade, sua sequência de envio na conversa.

O Service Broker coordena os níveis de prioridade em todas as filas de transmissão em uma instância do Mecanismo de Banco de Dados. O Service Broker primeiro transmite mensagens das conversas de prioridade 10 em todas as filas de transmissão, depois mensagens de conversas de prioridade 9 e assim por diante.

A diferença relativa no desempenho da mensagem aumenta com a diferença nos níveis de prioridade. Em um sistema que usa dois níveis de prioridade adjacentes, como 9 e 10, as mensagens com o nível de prioridade mais alto terão uma pequena vantagem de desempenho. Em um sistema que usa dois níveis de prioridade amplamente separados, como 1 e 10, as mensagens com o nível de prioridade mais alto têm uma vantagem de desempenho maior. Em sistemas que usam vários níveis de prioridade, a maior parte do processamento é alocada para os 2 ou 3 níveis de prioridade superiores.

Os níveis de prioridade especificados nas prioridades de conversação só são aplicados a mensagens na fila de transmissão se a HONOR_BROKER_PRIORITY opção de banco de dados estiver definida como ON. Se HONOR_BROKER_PRIORITY estiver definido como OFF, todas as mensagens colocadas na fila de transmissão desse banco de dados serão enviadas usando o nível de prioridade padrão de 5. Quando visualizada usando sys.transmission_queueo , a mensagem ainda exibe o nível de prioridade que recebeu do ponto de extremidade, mas o nível de prioridade padrão é usado para transmitir a mensagem.

Como os níveis de prioridade são aplicados a mensagens na fila de transmissão, eles geralmente não afetam as mensagens enviadas entre serviços na mesma instância do Mecanismo de Banco de Dados. As mensagens enviadas para um serviço na mesma instância são colocadas diretamente na fila do serviço sem passar por uma fila de transmissão. Algumas condições podem fazer com que mensagens locais sejam colocadas na fila de transmissão, como alguns tipos de erros ou a fila de destino inativa. Se a mensagem for armazenada na fila de transmissão, o nível de prioridade relevante será aplicado.

Mensagens e fragmentos de mensagens podem ser enviados fora da ordem de prioridade:

  • O Service Broker envia mensagens entre instâncias do Mecanismo de Banco de Dados usando blocos de fragmentos de mensagem. Se houver vários fragmentos de mensagem com prioridades diferentes prontos para enviar para uma instância, o Service Broker poderá enviar todos os fragmentos em um bloco. Alguns dos fragmentos no final do bloco podem ter um nível de prioridade mais baixo do que os fragmentos de mensagem aguardando a transmissão para outra instância.

  • O Service Broker inclui um mecanismo de prevenção de fome para ajudar a impedir que um grande número de mensagens de alta prioridade bloqueie mensagens de baixa prioridade. Uma mensagem de baixa prioridade que está aguardando há muito tempo pode ser enviada mesmo se houver mensagens de prioridade mais alta na fila.

Embora mensagens individuais ou fragmentos de mensagens possam ser enviados fora da ordem de prioridade, os efeitos devem ser pequenos quando considerados em muitos envios de mensagens.