Compartilhar via


Roteamento do Service Broker

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

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

Para a maioria dos aplicativos, uma abordagem simples sobre o roteamento do Service Broker é 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 lidar com casos em que um aplicativo precisa de um comportamento mais complexo. Para ver exemplos que ilustram o processo de roteamento, confira 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 conversas iniciadas naquele banco de dados. Para conversas 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. Para conversas que chegam de fora da instância, o SQL Server pesquisa por msdb.sys.routes.

O processo de correspondência básico é idêntico, quer a conversa 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 correspondentes. O Service Broker localiza um conjunto de rotas possíveis fazendo a correspondência do nome do serviço com o identificador do Service Broker.

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

  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 é 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 de confirmação subsequentes 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, veja 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 esse for o caso, a mensagem será entregue na instância atual como descrito em "Localizando o serviço de destino". Caso contrário, o SQL Server segue o processo padrão de correspondência.

Localizando rotas de correspondência

O procedimento a seguir descreve como o SQL Server faz a 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 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 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 tiver 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 como atrasada e solicite informações de roteamento daquele serviço.

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

  6. Se a conversa 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, roteie a conversa 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 como atrasada.

Quando uma conversa 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, nome de serviço e endereço de rede do Service Broker 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, 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 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.

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 do Service Broker na conversa 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. 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 conversas. 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 conversas de maneira 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, veja Encaminhamento de mensagens do Service Broker.

Se a rota correspondente contiver um endereço de rede que resolve na instância atual, o SQL Server tratará a conversa como originada fora da instância. O Service Broker roteia mensagens para a conversa 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.

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 Service Broker no outro endereço indicar que é a nova principal.

Nos casos em que o Service Broker não puder alcançar a principal, mas o parceiro não alegar ser a nova principal, o Service Broker não enviará mensagens ao parceiro. O Service Broker tentará 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.

Confira também