Roteamento do Service Broker

Este tópico descreve os detalhes de como o Service Broker faz o roteamento de mensagens. Para obter uma visão geral, consulte Rotas.

Para a maioria dos aplicativos, uma abordagem simples sobre o roteamento do Service Broker é o suficiente. Em cada banco de dados que contém um serviço, especifique uma rota para os serviços externos com os quais o serviço se comunica. No entanto,o Service Broker fornece um sistema de roteamento sofisticado para controlar casos em que um aplicativo precisa de um comportamento mais complexo. Para obter exemplos que ilustram o processo de roteamento, consulte Exemplos de roteamento do Service Broker.

Descrição do processo de roteamento

O SQL Server mantém dois níveis distintos de informações de roteamento. Cada banco de dados contém uma tabela de roteamento local, sys.routes, para conversações iniciadas naquele banco de dados. Para conversações que tiveram origem na instância do SQL Server, o SQL Server pesquisa a tabela de roteamento no banco de dados que criou a conversação. Para conversações que chegam de fora da instância, o SQL Server procura por msdb.sys.routes.

O processo de correspondência básico é idêntico, quer a conversação tenha origem na instância ou fora da instância. O processo ignora rotas que expiraram. O processo de roteamento consiste em três etapas distintas:

  1. Localizando rotas de correspondência. O Service Broker localiza um conjunto de possíveis rotas efetuando a correspondência entre o nome do serviço e o identificador do Service Broker.

  2. Escolhendo uma rota. O Service Broker escolhe uma rota entre o conjunto de possíveis rotas.

  3. Localizando o serviço de destino. Quando a rota escolhida especifica 'LOCAL' como o endereço de rede, o Service Broker localiza o serviço na instância. Se o serviço não existir na instância, o Service Broker poderá retornar à etapa 2 e escolher outra rota.

Quando uma mensagem foi enviada do iniciador para o destino e o iniciador recebe uma mensagem de confirmação do destino, o iniciador usa o identificador do Service Broker na mensagem de confirmação para rotear as mensagens subseqüentes para o mesmo destino. O Service Broker controla as mensagens de confirmação; o processo é transparente para um aplicativo que usa o Service Broker. Para obter mais informações sobre mensagens de confirmação, consulte Protocolos de comunicação do Service Broker.

Mensagens de resposta de um serviço de destino

Quando uma mensagem que chega de uma instância externa é de um serviço de destino, o SQL Server verifica se a instância atual contém o identificador do Service Broker na mensagem. Se contiver, a mensagem será entregue na instância atual como descrito em "Localizando o serviço de destino". Caso contrário, o SQL Server seguirá o processo de correspondência padrão.

Localizando rotas de correspondência

O procedimento a seguir descreve como o SQL Server efetua correspondência das rotas. Em cada etapa, se uma ou mais rotas corresponderem, o processo de correspondência terminará e o Service Broker escolherá uma das rotas correspondentes, como segue:

  1. Se a conversação especificar um identificador do Service Broker, localize uma rota com uma correspondência exata para o nome do serviço e o identificador do Service Broker.

  2. Localize uma correspondência exata para o nome de serviço entre rotas que não especificam um identificador do Service Broker.

  3. Se a conversação não especificar um identificador do Service Broker, localize uma correspondência exata para o nome do serviço entre rotas que especificam um identificador do Service Broker. Se a tabela de roteamento possuir rotas que correspondem ao nome do serviço e diferentes identificadores do Service Broker, escolha arbitrariamente um identificador do Service Broker. Em seguida, efetue a correspondência somente das rotas que usam o identificador do Service Broker.

  4. Se houver uma rota para um serviço de roteamento dinâmico e nenhuma solicitação pendente para a rota do serviço, marque a conversação como atrasada e solicite informações de roteamento daquele serviço.

  5. Localize uma rota que não especifique nem o nome de serviço nem o identificador do Service Broker.

  6. Se a conversação especificar um identificador do Service Broker e se a instância contiver um ou mais bancos de dados que contêm serviços com nomes que correspondem ao nome especificado na conversação, roteie a conversação como se a tabela de roteamento contivesse uma rota com o nome do serviço e o endereço de rede 'LOCAL'.

  7. Marque a conversação como atrasada.

Quando uma conversação for marcada como atrasada, o Service Broker executará o processo de correspondência novamente depois de um tempo limite. Observe que a falha em localizar uma rota correspondente não é considerada um erro.

Escolhendo uma rota

Se o processo de correspondência localizar mais de uma rota correspondente, o Service Broker escolherá uma rota entre as rotas correspondentes. Para isso, rotas com o mesmo identificador do Service Broker, nome de serviço e endereço de rede serão consideradas idênticas. O Service Broker usa o seguinte procedimento para escolher a rota exata. Em cada etapa, o processo continuará na etapa seguinte, se não houver rotas que correspondam à especificação de endereço para aquela etapa.

  1. Escolha uma rota entre as rotas que especificam um endereço de espelho.

  2. Escolha uma rota entre as rotas que especificam 'LOCAL' como endereço de rede. Se essa instância do SQL Server não contiver um serviço que corresponda ao nome especificado na conversação, continue na etapa 3.

  3. Escolha uma rota entre as rotas que especificam um endereço de rede.

  4. Escolha uma rota entre as rotas que especificam 'TRANSPORT' como endereço de rede.

Se o encaminhamento do agente não estiver ativo, o Service Broker descartará a mensagem se a conversação não teve origem na instância atual e se o endereço da rota escolhida não for 'LOCAL'.

Localizando o serviço de destino

Como descrito anteriormente, o Service Broker entrega mensagens para um serviço na instância atual quando a rota correspondente especifica 'LOCAL' como endereço de rede. Para mensagens que se originam fora da instância, a rota deve estar em msdb.sys.routes. Para mensagens que se originam na instância, a rota correspondente deve estar na tabela sys.routes do banco de dados que inicia a conversação.

Quando o Service Broker determina que o serviço da mensagem está na instância atual, o Service Broker deve localizar o serviço na instância. Quando existe um identificador de conversação do Service Broker na conversação ou na rota, o Service Broker entrega mensagens ao banco de dados identificado pelo identificador do Service Broker.

Caso contrário, o Service Broker localiza o serviço procurando primeiro o nome do serviço no banco de dados que contém a conversação. Em seguida, ele pesquisa o nome do serviço em outros bancos de dados na instância. O Service Broker entrega a mensagem ao primeiro serviço localizado. Observe, entretanto, que a ordem na qual o Service Broker pesquisa nos outros bancos de dados em uma instância não é especificada e não há garantia de consistência entre as conversações. Isso significa que se mais de uma cópia do serviço de destino existir na instância, o Service Broker escolherá aleatoriamente o serviço de destino.

Outras considerações

Para segurança aprimorada, o roteamento do Service Broker contém proteções contra loops de roteamento. O roteamento do Service Broker leva em conta o espelhamento de banco de dados e pode redirecionar conversações de forma transparente para o parceiro ativo de um banco de dados espelhado.

Loops de roteamento

O encaminhamento de mensagem do Service Broker controla o número de vezes que uma mensagem foi encaminhada para proteger contra loops de roteamento intermináveis. Para obter mais informações, consulte Encaminhamento de mensagens do Service Broker.

Se a rota correspondente contiver um endereço de rede que resolve para a instância atual, o SQL Server tratará a conversação como originada fora da instância. O Service Broker roteia mensagens para a conversação usando as rotas em msdb.sys.routes. O roteamento dessas mensagens é idêntico ao roteamento de mensagens de fora da instância. Em especial, o encaminhamento de mensagens deve estar ativo para que o Service Broker encaminhe a mensagem para um endereço de rede diferente de 'LOCAL'.

Endereços de espelho

Rotas com endereços de espelho têm precedência quando se escolhe uma rota do conjunto inicial de rotas correspondentes. Porém, o Service Broker não dá atenção especial a endereços de espelho ao localizar rotas correspondentes para uma conversação.

Quando o Service Broker escolhe uma rota que especifica um endereço de espelho e o Service Broker não entregou anteriormente uma mensagem usando a rota, o Service Broker envia uma solicitação para ambos os endereços para determinar qual instância é atualmente a principal. Quando o Service Broker identifica a principal, o Service Broker envia todas as mensagens que usam a rota para a principal, sem contatar a instância espelho. Se a principal estiver fora de alcance ou aquela instância indicar que não é mais a principal, o Service Broker enviará mensagens para o outro endereço do par se a instância do SQL Server no outro endereço indicar que é a nova principal.

Em casos onde o Service Broker não pode alcançar a principal, mas o parceiro não alega ser a nova principal, o Service Broker não envia mensagens ao parceiro. O Service Broker tenta novamente o endereço da principal e o endereço do parceiro até que a principal seja alcançada ou o parceiro indique que é agora a principal. Com essa abordagem, o Service Broker entrega as mensagens com segurança quando a principal e o parceiro podem se comunicar, mas a instância que envia a mensagem não pode contatar a principal