Prioridades de conversação

As prioridades de conversação 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 conversações Service Broker serão atribuídas a um nível de prioridade. Mensagens de conversações com altos níveis de prioridade são, em geral, enviadas ou recebidas antes das mensagens de conversações com baixos níveis de prioridade.

Usos de prioridades de conversação

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

  • Identificar conversações 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ção e pontos de extremidade de conversação

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

  • Um nome para a prioridade de conversação.

  • Um nível de prioridade para atribuir a conversações 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 conversações 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ção durante a criação dos pontos de extremidade. Cada conversação tem dois pontos de extremidade de conversação:

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

    • Envia a partir do serviço iniciador.

    • Recebe da fila do iniciador.

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

  • O ponto de extremidade de conversação de destino associa o outro lado da conversação ao serviço de destino e à fila. O ponto de extremidade de conversação 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ção de destino incluem o seguinte:

    • Recebe da fila de destino.

    • Envia do serviço de destino.

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

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

  • Com relação ao ponto de extremidade de conversação 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ção 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ção durante a criação de pontos de extremidade de conversação. O ponto de extremidade de conversação retém o nível de prioridade até que a conversação termine. As novas prioridades ou as alterações de prioridades existentes não se aplicam às conversações existentes.

O Service Broker atribui o nível de prioridade ao ponto de extremidade de conversação a partir da prioridade de conversação 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ção. 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 os pontos de extremidade de conversação. O Service Broker atribui, independentemente, um nível de prioridade a cada um dos pontos de extremidade. Para que o Service Broker atribua níveis de prioridade aos pontos de extremidade de conversação iniciador e de destino, é preciso assegurar que os dois pontos estejam cobertos por prioridades de conversação. Se o iniciador e os pontos de extremidade de conversação de destino estiverem em bancos de dados separados, será necessário criar prioridades de conversação 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ção usando uma prioridade de conversação que especifique o nome do contrato usado pela conversação e ANY para ambos os nomes de serviço remoto e local.

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

    • Uma conversação 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ção 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ção de uma conversação. 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çã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, pode-se configurar uma conversação, de modo que o ponto de extremidade de conversação 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ção recebe o mesmo nível de prioridade do mais alto nível de prioridade atribuído a qualquer conversação em que o seguinte seja verdadeiro:

  • A conversação é membro do grupo.

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

A todos os pontos de extremidade de conversação do banco de dados serão atribuídas prioridades padrão 5 se nenhuma prioridade de conversação tiver sido criada no banco de dados.

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

Exemplo de prioridade de conversação

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ção de iniciador e as operações a ele associadas:

  • SEND de RequestMessage do InitiatorService para TargetQueue.

  • RECEIVE deReplyMessage do InitiatorQueue.

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

Esse script especifica o nível de prioridade para o ponto de extremidade de conversação 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 conversações de prioridade alta antes de enviar e receber mensagens para conversações de baixa prioridade. As mensagens de conversações de prioridade alta passam menos tempo em filas do que as mensagens de conversações 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ção de uma fila.

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

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

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

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

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

  • Em uma conversação, as mensagens são recuperadas na mesma seqüê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 seqüência, com base em:

  • Nível de prioridade de seu ponto de extremidade de conversação associado.

  • Dentro do nível de prioridade, sua seqüência de envio na conversação.

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 conversações de prioridade 10 de todas as filas de transmissão, depois as mensagens com conversações 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ção só se aplicam 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.