Roteamento do Service Broker

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

Este artigo descreve os detalhes de como o Service Broker roteia 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 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 para sys.routesconversas iniciadas nesse 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 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. Encontre rotas correspondentes: o Service Broker localiza um conjunto de rotas possíveis correspondendo ao nome do serviço e ao identificador do Service Broker.

  2. Escolha uma rota: o Service Broker escolhe uma rota entre o conjunto de rotas possíveis.

  3. Localize 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, consulte os protocolos de comunicação do Service Broker.

Responder mensagens 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. Nesse caso, a mensagem será entregue na instância atual, conforme descrito em Localizar o serviço de destino posteriormente neste artigo. Caso contrário, o SQL Server segue o processo de correspondência padrão.

Localizar rotas correspondentes

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 do serviço entre as 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 as 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 contenham serviços com nomes que correspondam ao nome especificado na conversa, encaminhe a conversa como se a tabela de roteamento contivesse uma rota com o nome do serviço e o endereço 'LOCAL'de rede.

  7. Marque a conversa como atrasada.

Quando uma conversa é marcada como atrasada, o Service Broker executa o processo de correspondência novamente após um período de tempo limite. A falha ao localizar uma rota correspondente não é considerada um erro.

Escolher 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 o 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 o endereço de rede.

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

Localizar o serviço de destino

Conforme descrito anteriormente, o Service Broker entrega mensagens a um serviço na instância atual quando a rota correspondente especifica 'LOCAL' como o endereço de rede. Para mensagens que se originam fora da instância, a rota deve estar em msdb.sys.routes. Para mensagens originadas na instância, a rota correspondente deve estar na sys.routes tabela 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. No entanto, a ordem na qual o Service Broker pesquisa os outros bancos de dados em uma instância não é especificada e não tem garantia de ser consistente de conversa para conversa. 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 rota

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 mais informações, consulte 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 particular, 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 espelho

Rotas com endereços de espelho têm precedência quando se escolhe uma rota do conjunto inicial de rotas correspondentes. No entanto, o Service Broker não dá uma consideração especial aos endereços espelho ao encontrar rotas correspondentes para uma conversa.

Quando o Service Broker escolhe uma rota que especifica um endereço espelho e o Service Broker não entregou uma mensagem anteriormente 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 o principal estiver inacessível, ou se essa instância indicar que não é mais o principal, o Service Broker enviará mensagens para o outro endereço do par, caso a instância do SQL Server no outro endereço indique que é o novo principal.

Nos casos em que o Service Broker não consegue alcançar o principal, mas o parceiro não reivindica ser o novo principal, o Service Broker não envia mensagens para o parceiro. O Service Broker então tenta novamente o endereço principal e o endereço do parceiro até que o principal esteja acessível ou o parceiro indique que agora é o principal. Ao adotar essa abordagem, o Service Broker fornece mensagens de forma confiável quando o principal e o parceiro podem se comunicar, mas a instância que envia a mensagem não pode alcançar o principal.