Gerenciar identidades do Service Broker

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

Cada banco de dados contém um identificador exclusivo utilizado para rotear mensagens do Service Broker para esse banco de dados. Este tópico descreve os identificadores do Service Broker, como o Service Broker protege contra o direcionamento incorreto de mensagens e as opções disponíveis para o gerenciamento de identificadores do Service Broker.

Identificadores do Service Broker

Cada banco de dados contém um identificador do Service Broker que o distingue de todos os outros bancos de dados na rede. A service_broker_guid coluna da exibição de sys.databases catálogo mostra o identificador do Service Broker para cada banco de dados na instância. Os sistemas do Service Broker podem ser projetados para executar várias cópias de um serviço. Cada cópia do serviço é executada em um banco de dados separado. Em um sistema que tem várias cópias de um serviço, use a BROKER_INSTANCE cláusula da CREATE ROUTE instrução para criar uma rota para uma cópia específica do serviço.

O roteamento do Service Broker usa o identificador do Service Broker para assegurar que todas as mensagens de uma conversa sejam entregues ao mesmo banco de dados. A BEGIN DIALOG CONVERSATION instrução abre uma conversa com um serviço de destino. Se uma conversa for aberta com êxito, a mensagem de confirmação do serviço de destino conterá o identificador do Service Broker para o banco de dados de destino. O Service Broker roteará todas as mensagens da conversa para o banco de dados especificado.

Os identificadores do Service Broker podem ser especificados na TO SERVICE cláusula da BEGIN DIALOG CONVERSATION instrução para controlar o tipo de roteamento a ser executado:

  • Para rotear conversas para uma cópia específica de um serviço, especifique um service_broker_guid. Por exemplo, você pode ter três cópias de um serviço em três bancos de dados na rede: um banco de dados de desenvolvimento, um banco de dados de teste e um banco de dados de produção. As BEGIN DIALOG CONVERSATION instruções em cada sistema devem especificar service_broker_guid para garantir que todas as mensagens acessem o banco de dados correto.

  • Para permitir que o Service Broker balancee cargas de conversa em várias cópias de um serviço, não especifique service_broker_guid. O Service Broker, como alternativa, escolherá entre as rotas com o mesmo nome de serviço especificado na TO SERVICE cláusula de BEGIN DIALOG CONVERSATION.

Por padrão, se houver apenas uma cópia de um serviço em uma rede, o Service Broker roteia corretamente as conversas. Você não precisa especificar o identificador do Service Broker em instruções ou CREATE ROUTE instruçõesBEGIN DIALOG CONVERSATION.

Para obter mais informações sobre a correspondência de rotas do Service Broker, consulte o roteamento do Service Broker.

Para dar suporte corretamente à entrega de mensagens, cada identificador do Service Broker deve ser exclusivo em todas as instâncias do Mecanismo de Banco de Dados na mesma rede. Caso contrário, as mensagens podem ser direcionadas de modo incorreto. Quando um novo banco de dados é criado, ele recebe um novo identificador do Service Broker que deve ser exclusivo na rede. O identificador é restaurado quando o banco de dados é restaurado ou anexado. Tenha cuidado ao restaurar e anexar bancos de dados. Você não deve ter vários bancos de dados que estejam executando ativamente operações do Service Broker e usando os mesmos identificadores.

Entrega de mensagens do Service Broker

O SQL Server fornece um mecanismo para desativação da entrega de mensagens do Service Broker em um banco de dados, caso ele tenha o mesmo identificador do Service Broker que outro banco de dados na mesma rede. Quando a entrega de mensagens é desativada em um banco de dados, todas as mensagens enviadas desse banco de dados permanecem na fila de transmissão dele. Além disso, o Service Broker não considera que os serviços nesse banco de dados estejam disponíveis para receber mensagens. Esses serviços não são considerados quando o roteamento do Service Broker localiza um serviço de destino em uma instância.

A desativação da entrega de mensagens do Service Broker permite anexar com segurança um backup de um banco de dados para fins de solução de problemas ou recuperação de dados sem o risco de mensagens mal redirecionadas. A is_broker_enabled coluna mostra o estado atual da entrega de mensagens do Service Broker para cada banco de sys.databases dados.

Quando você anexar ou restaurar um banco de dados, tenha cuidado para assegurar que somente um banco de dados que tenha um determinado identificador do Service Broker tenha a entrega de mensagens ativa. Caso contrário, talvez as mensagens sejam direcionadas incorretamente e pode ser que o processamento de uma conversa ocorra na cópia errada do banco de dados.

Gerenciar identificadores e entrega de mensagens

O CREATE DATABASE comando, o ALTER DATABASE comando e o RESTORE DATABASE comando contêm opções para ativar a entrega de mensagens do Service Broker. Eles também contêm opções para alterar o identificador do Service Broker de um banco de dados.

Por padrão, quando você anexa ou restaura um banco de dados, o identificador do Service Broker e o status da entrega de mensagens permanecem inalterados. Normalmente, você não altera o identificador do Service Broker nas seguintes situações:

  • Quando restaura um backup para fins de recuperação.
  • Quando configura um par espelhado.
  • Quando configura o envio de logs para um servidor em espera. Ao fazer uma cópia do banco de dados, você altera o identificador da instância.

Há quatro opções para gerenciar os identificadores e a entrega de mensagens:

  • ENABLE_BROKER: essa opção ativa a entrega de mensagens do Service Broker, preservando o identificador existente do Service Broker para o banco de dados.

    Observação

    Habilitar o SQL Server Service Broker em qualquer banco de dados requer um bloqueio de banco de dados. Para habilitar o Service Broker no banco de dados, primeiro interrompa o msdb SQL Server Agent. O Service Broker pode obter o bloqueio necessário.

  • DISABLE_BROKER: essa opção desativa a entrega de mensagens do Service Broker, preservando o identificador existente do Service Broker para o banco de dados.

  • NEW_BROKER: essa opção ativa a entrega de mensagens do Service Broker e cria um novo identificador do Service Broker para o banco de dados. Essa opção encerra todas as conversas existentes no banco de dados e retorna um erro para cada conversa. Isso ocorre porque essas conversas não usam o novo identificador. Qualquer rota que referencia o antigo identificador do Agente de Serviço deve ser recriada novamente com o novo identificador.

  • ERROR_BROKER_CONVERSATIONS: essa opção ativa a entrega de mensagens do Service Broker, preservando o identificador existente do Service Broker para o banco de dados. O Service Broker encerra todas as conversas no banco de dados e retorna um erro para cada conversa. Em geral, essa opção é usada quando você precisa restaurar um banco de dados em um ponto no tempo diferente de outros bancos de dados com os quais ele tem conversas abertas. Todas as conversas no banco de dados restaurado devem ser encerradas com um erro porque agora estão fora de sincronia com os outros bancos de dados. O identificador do Service Broker é mantido de modo que todas as rotas que o referenciam ainda são válidas.

Independentemente da opção especificada, o SQL Server não permite que dois bancos de dados com o mesmo identificador do Service Broker tenham a entrega de mensagens ativa na mesma instância do SQL Server. Se você anexar um banco de dados que tenha o mesmo identificador do Service Broker que um banco de dados existente, o SQL Server desativara a entrega de mensagens do Service Broker no banco de dados que está sendo anexado.

Para obter mais informações sobre as opções para anexar bancos de dados, consulte CREATE DATABASE e ALTER DATABASE. Para obter informações sobre como ativar a entrega de mensagens do Service Broker em um banco de dados, consulte Como ativar a entrega de mensagens do Service Broker em bancos de dados.