Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Azure SQL Managed Instance
Este artigo descreve os detalhes de como o Service Broker roteia mensagens. Para obter uma visão geral, consulte Rotas.
Para a maioria dos aplicativos, uma abordagem simples para o roteamento do Service Broker funciona bem. 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, sys.routes, para conversas iniciadas nesse banco de dados. Para conversas originadas 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 básico de correspondência é idêntico, seja a conversa tenha origem na instância ou fora dela. O processo ignora rotas que expiraram. O processo de roteamento consiste em três etapas distintas:
Encontre rotas correspondentes: o Service Broker encontra um conjunto de rotas possíveis combinando o nome do serviço e o identificador do Service Broker.
Escolha uma rota: o Service Broker escolhe uma rota entre o conjunto de rotas possíveis.
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 nas mensagens de confirmação para rotear mensagens subsequentes para o mesmo destino. O Service Broker lida com 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 fora da instância é de um serviço de destino, o SQL Server verifica se a instância atual contém o identificador do Service Broker na mensagem. Em caso afirmativo, a mensagem é entregue na instância atual, conforme descrito em Localizar o serviço de destino mais adiante neste artigo. Caso contrário, o SQL Server segue o processo de correspondência padrão.
Encontrar rotas correspondentes
O procedimento a seguir descreve como o SQL Server faz correspondência de rotas. Em cada etapa, se uma ou mais rotas corresponderem, o processo de correspondência termina e o Service Broker escolhe uma das rotas correspondentes da seguinte maneira:
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.
Encontre uma correspondência exata para o nome do serviço entre as rotas que não especificam um identificador do Service Broker.
Se a conversa não especificar um identificador do Service Broker, encontre 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 contiver rotas que correspondam ao nome do serviço e tenham identificadores diferentes do Service Broker, escolha arbitrariamente um identificador do Service Broker. Em seguida, emparelhe apenas as rotas que usam o identificador do Service Broker.
Se houver uma rota para um serviço de roteamento dinâmico e nenhuma solicitação por uma rota para o serviço estiver pendente, sinalize a conversa como atrasada e solicite a informação de roteamento desse serviço.
Encontre uma rota que não especifique o nome do serviço nem o identificador do Service Broker.
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, roteie a conversa como se a tabela de roteamento contivesse uma rota com o nome do serviço e o endereço
'LOCAL'de rede.Assinale a conversação como atrasada.
Quando uma conversa é marcada como adiada, o Service Broker executa o processo de correspondência novamente após um tempo de espera. A falha em encontrar uma rota correspondente não é considerada um erro.
Escolha uma rota
Se o processo de correspondência encontrar mais de uma rota correspondente, o Service Broker escolherá uma rota entre as rotas correspondentes. Para essa finalidade, as rotas que têm o mesmo identificador do Service Broker, nome do serviço e endereço de rede são consideradas idênticas. O Service Broker usa o procedimento a seguir para escolher a rota exata. Em cada etapa, o processo continua na próxima etapa se não houver rotas que correspondam à especificação de endereço para a etapa.
Escolha uma rota entre as rotas que especificam um endereço espelho.
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.Escolha uma rota entre as rotas que especificam um endereço de rede.
Escolha uma rota entre as rotas que especificam
'TRANSPORT'como o endereço de rede.
Se o encaminhamento no broker não estiver ativo, o Service Broker descartará a mensagem se a conversa não for iniciada na instância atual e o endereço da rota escolhida não for 'LOCAL'.
Localize 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 é especificada 'LOCAL' como o endereço de rede. Para mensagens originadas 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 se encontra na instância atual, ele deve localizar esse serviço dentro da instância. Quando existe um identificador do Service Broker para a conversação no diálogo 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 pesquisando primeiro o nome do serviço no banco de dados que contém a conversa. Em seguida, ele procura o nome do serviço nos 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 é garantida que seja consistente de conversa para conversa. Isso significa que, se existir mais de uma cópia do serviço de destino na instância, o Service Broker selecionará aleatoriamente o serviço a ser direcionado.
Outras considerações
Para maior confiabilidade, o roteamento do Service Broker contém proteções contra ciclos de roteamento. O roteamento do Service Broker reconhece o espelhamento de banco de dados e pode redirecionar conversas de forma transparente para o parceiro ativo de um banco de dados espelhado.
Circuitos de rota
O encaminhamento de mensagens do Service Broker rastreia 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 se resolve para a instância atual, o SQL Server tratará a conversa como se tivesse se originado fora da instância. O Service Broker roteia mensagens para a conversa usando as rotas em msdb.sys.routes. O roteamento para essas mensagens é idêntico ao roteamento para 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
As rotas com endereços de espelho têm maior precedência na escolha de uma rota do conjunto inicial de rotas correspondentes. No entanto, o Service Broker não dá atenção especial aos endereços espelhados ao identificar 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 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 o principal, o Service Broker envia todas as mensagens que usam a rota para o principal sem entrar em contato com a instância espelhada. Se a entidade principal estiver inacessível ou se uma 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.
Nos casos em que o Service Broker não consegue entrar em contato com a entidade principal, mas o parceiro não afirma ser o novo principal, o Service Broker não envia mensagens para o parceiro. Em seguida, o Service Broker tenta novamente contactar o endereço principal e o endereço do parceiro até que o principal seja acessível ou que o parceiro indique que agora é o principal. Ao adotar essa abordagem, o Service Broker entrega 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.