Compartilhar via


Prioridades de Conversa

Aplica-se a: SQL Server Instância Gerenciada de SQL do Azure

As prioridades de conversa são um conjunto de regras definidas pelo usuário. Cada uma delas especifica um nível de prioridade e critérios que determinam quais conversas do Service Broker serão atribuídas a um nível de prioridade. Mensagens de conversas com altos níveis de prioridade são, em geral, enviadas ou recebidas antes das mensagens de conversas com baixos níveis de prioridade.

Usos de prioridades de conversa

As prioridades de conversa podem ser usadas para realizar o seguinte:

  • Identificar conversas que têm precedência sobre outras.

  • Oferecer suporte a diferentes camadas de serviço, onde as mensagens de clientes que pagam taxas mais altas são enviadas antes das mensagens de clientes que pagam taxas mais baixas.

  • Favorecer as solicitações de cliente em detrimento das tarefas em segundo plano. Por exemplo, registros de clientes novos devem ter prioridade mais alta do que o envio de resumos de transações comerciais para um data warehouse.

Prioridades de conversa e pontos de extremidade de conversa

As prioridades de conversa são criadas em todos os bancos de dados que usam a instrução CREATE BROKER PRIORITY. As prioridades de conversa definem o seguinte:

  • Um nome para a prioridade de 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). O padrão é 5.

  • Os critérios que determinam a 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 a pontos de extremidade de conversa durante a criação dos pontos de extremidade. Cada conversa tem dois pontos de extremidade de conversa:

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

    • Envia a partir do serviço iniciador.

    • Recebe da fila do iniciador.

    • Obter o próximo grupo de conversa da fila de iniciador.

  • O ponto de extremidade de conversa de destino associa o outro lado da conversa ao serviço de destino e à fila. O ponto de extremidade de conversa de destino é criado durante a colocação da primeira mensagem do iniciador na fila de destino. As operações associadas ao ponto de extremidade de conversa de destino incluem o seguinte:

    • Recebe da fila de destino.

    • Envia do serviço de destino.

    • Obtendo o próximo grupo de conversa da fila de destino.

Qual serviço será avaliado como serviço local ou remoto dependerá do tipo de ponto de extremidade de conversa:

  • Com relação ao ponto de extremidade de conversa de iniciador, o serviço iniciador é o serviço local e o serviço de destino é o serviço remoto.

  • Com relação ao ponto de extremidade de conversa de destino, o serviço de destino é o serviço local e o serviço iniciador é o serviço remoto.

Como o Service Broker atribui níveis de prioridade

O Service Broker atribui níveis de prioridade de conversa durante a criação de pontos de extremidade de conversa. O ponto de extremidade de conversa retém o nível de prioridade até que a conversa termine. As novas prioridades ou as alterações de prioridades existentes não se aplicam às conversas existentes.

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

Contrato de ponto de extremidade

Serviço local de ponto de extremidade

Serviço remoto de ponto de extremidade

Contrato de prioridade

Serviço local de prioridade

Serviço remoto de prioridade

Contrato de prioridade

Serviço local de prioridade

ANY

Contrato de prioridade

ANY

Serviço remoto de prioridade

Contrato de prioridade

ANY

ANY

ANY

Serviço local de prioridade

Serviço remoto de prioridade

ANY

Serviço local de prioridade

ANY

ANY

ANY

Serviço remoto de prioridade

ANY

ANY

ANY

O Service Broker procura primeiro uma prioridade cujo contrato especificado, serviço local e serviço remoto correspondam aos usados pelo ponto de extremidade de conversa. Se for encontrado algum, o Service Broker, em seguida, procurará uma prioridade com contrato e serviço local que correspondam aos usados pelo ponto de extremidade, no qual o serviço remoto esteja especificado como ANY. Isso prossegue com relação a todas as variações listadas na tabela de precedência. Se não houver correspondência, a prioridade padrão de 5 será atribuída ao ponto de extremidade.

Os protocolos de comunicação do Service Broker não transmitem níveis de prioridade entre pontos de extremidade de conversação. O Service Broker atribui um nível de prioridade independentemente a cada ponto de extremidade. Para que o Service Broker atribua níveis de prioridade aos pontos de extremidade de conversa iniciador e de destino, é preciso assegurar que os dois pontos estejam cobertos por prioridades de conversa. Se o iniciador e os pontos de extremidade de conversa de destino estiverem em bancos de dados separados, será necessário criar prioridades de conversa em todos os bancos de dados. Se o iniciador e os pontos de extremidade de destino estiverem no mesmo banco de dados:

  • Cubra os pontos de extremidade de conversa usando uma prioridade de conversa que especifique o nome do contrato usado pela conversa e ANY para ambos os nomes de serviço remoto e local.

  • É possível cobrir todos os pontos de extremidade de conversa, usando separadamente duas prioridades de conversa:

    • Uma conversa para o ponto de extremidade iniciador que especifica o nome do serviço iniciador para LOCAL_SERVICE_NAME e 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 para LOCAL_SERVICE_NAME e o nome do serviço iniciador para REMOTE_SERVICE_NAME.

O mesmo nível de prioridade é especificado, em geral, para ambos os pontos de extremidade de conversa de uma conversa. Embora diferentes níveis de prioridade possam ser especificados para cada ponto de extremidade, fazer isso não significa que as mensagens sejam enviadas com mais rapidez em uma direção que em outra. As mensagens são enviadas de um ponto de extremidade de conversa 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, pode-se configurar uma conversa, de modo que o ponto de extremidade de conversa iniciador tenha nível de prioridade 10 e o ponto de extremidade de destino tenha nível de prioridade 1. Nesse caso:

  • As mensagens transmitidas do serviço iniciador com 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 com nível de prioridade 1 são recebidas da fila do iniciador usando o nível de prioridade 10.

O grupo de conversa recebe o mesmo nível de prioridade do mais alto nível de prioridade atribuído a qualquer conversa em que o seguinte seja verdadeiro:

  • A conversa é membro do grupo.

  • A conversa tem mensagens atualmente na fila de serviço.

A todos os pontos de extremidade de conversa do banco de dados serão atribuídas prioridades padrão 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 com o nível de prioridade padrão 5.

Exemplo de prioridade de conversa

Considere um sistema com o seguinte:

  • Um InitiatorDB contendo InitiatorService e InitiatorQueue.

  • Um TargetDB contendo TargetService e TargetQueue.

  • Um contrato denominado SimpleContract, que especifique que RequestMessages sejam enviadas do InitiatorService para o TargetService. Especifica igualmente que ReplyMessages sejam enviadas do TargetService para o InitiatorService.

Esse script especifica o nível de prioridade para o ponto de extremidade de conversa de iniciador e as operações a ele associadas:

  • SEND de RequestMessage do InitiatorService para TargetQueue.

  • RECEIVE de ReplyMessage do InitiatorQueue.

    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

Esse script especifica o nível de prioridade para o ponto de extremidade de conversa de destino e as operações a ele associadas:

  • RECEIVE de RequestMessage de TargetQueue.

  • SEND de ReplyMessage do TargetService para 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

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

Níveis de prioridade de recepção

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

O nível de prioridade é um dos fatores que determinam o conjunto de mensagens recebidas por uma RECEIVE, assim como a sequência em que as mensagens serão recebidas:

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

    • Uma RECEIVE sem cláusula WHERE sempre recuperará mensagens pertencentes ao grupo de conversa desbloqueado da mais alta prioridade que tenha mensagens na fila.

    • Uma RECEIVE com cláusula WHERE recuperará as mensagens para o grupo de conversa especificado na cláusula WHERE.

  • Em um grupo de conversa, RECEIVE recuperará as mensagens que dependem do nível de prioridade das conversas do grupo. Todas as mensagens da conversa com o mais alto nível de prioridade são recuperadas primeiramente; em seguida, as mensagens relativas à conversa com o próximo nível mais alto de prioridade, e assim por diante.

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

GET CONVERSATION GROUP retorna o grupo com o mais alto nível de prioridade do conjunto de grupos desbloqueados que tenham 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:

  • Nível de prioridade de seu 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 de uma instância do Mecanismo de Banco de Dados. O Service Broker transmite primeiro as mensagens de conversas de prioridade 10 de todas as filas de transmissão, depois as mensagens com conversas de prioridade 9 e assim por diante.

A diferença relativa no desempenho das mensagens se amplia com a diferença dos níveis de prioridade. Em um sistema que utilize níveis de prioridade adjacentes, como 9 e 10, as mensagens com nível de prioridade superior terão pequena vantagem de desempenho. Em um sistema que utilize níveis de prioridade amplamente separados, como 1 para 10, as mensagens com nível de prioridade alto terão uma maior vantagem de desempenho. Em sistemas que utilizem vários níveis de prioridade, a maior parte do processamento é alocada aos níveis de prioridade superiores 2 ou 3.

Os níveis de prioridade especificados em prioridades de conversa se aplicam apenas a mensagens da fila de transmissão caso a opção de banco de dados HONOR_BROKER_PRIORITY esteja definida como ON. Se HONOR_BROKER_PRIORITY estiver definida como OFF, todas as mensagens colocadas na fila de transmissão para esse banco de dados serão enviadas com o nível padrão de prioridade 5. Quando exibida com o uso de sys.transmission_queue, a mensagem ainda exibirá o nível de prioridade que recebeu do ponto de extremidade; porém, o nível de prioridade padrão será usado para transmitir a mensagem.

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

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

  • O Service Broker envia mensagens entre instâncias do Mecanismo de Banco de Dados que usam blocos de fragmentos de mensagem. Se houver muitos fragmentos de mensagens com diferentes prioridades, prontos para serem enviados a uma instância, o Service Broker poderá enviar todos os fragmentos em um único bloco. Alguns fragmentos do final do bloco podem ter um nível de prioridade inferior aos fragmentos de mensagens que aguardam para serem transmitidos a uma outra instância.

  • O Service Broker inclui um mecanismo de prevenção de privação para ajudar a evitar que grandes números de mensagens de alta prioridade bloqueiem as mensagens de baixa prioridade. Uma mensagem de baixa prioridade que tenha aguardado por um longo tempo pode ser enviada mesmo que haja mensagens de alta prioridade na fila.

Embora as mensagens individuais ou fragmentos de mensagens possam ser enviadas sem ordem de prioridade, os efeitos devem ser menores quando considerados em vários envios de mensagens.

Confira também