Gerenciando identidades do Service Broker

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 coluna service_broker_guid da exibição de catálogo sys.databases mostra o identificador do Service Broker para cada banco de dados na instância. Os sistemas do Service Broker podem ser designados 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 tenha várias cópias de um serviço, use a cláusula BROKER_INSTANCE da instrução CREATE ROUTE 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ção sejam entregues ao mesmo banco de dados. A instrução BEGIN DIALOG CONVERSATION abre uma conversação com um serviço de destino. Se uma conversação 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ção para o banco de dados especificado.

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

  • Para rotear conversações 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 instruções BEGIN DIALOG CONVERSATION em cada sistema devem especificar service_broker_guid para assegurar que todas as mensagens sigam para o banco de dados correto.

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

Por padrão, se houver só uma cópia de um serviço em uma rede, o Service Broker roteará as conversações corretamente. Você não tem que especificar o identificador do Service Broker nas instruções CREATE ROUTE ou BEGIN DIALOG CONVERSATION.

Para obter mais informações sobre correspondência de rotas do Service Broker, consulte 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 vários executando operações do Service Broker ativamente 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 os serviços nesse banco de dados como disponíveis para o recebimento de 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 lhe 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 direcionamento incorreto de mensagens. A coluna is_broker_enabled de sys.databases mostra o estado atual da entrega de mensagens do Service Broker para cada banco de 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ção ocorra na cópia errada do banco de dados.

Gerenciando identificadores e entrega de mensagens

Os comandos CREATE DATABASE, ALTER DATABASE e RESTORE DATABASE 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. Em geral, 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ê está alterando o identificador da instância.

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

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

    ObservaçãoObservação

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

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

  • NEW_BROKER. Esta opção ativa a entrega de mensagens do Service Broker e cria um novo identificador do Service Broker para o banco de dados. Ela termina todas as conversações existentes no banco de dados e retorna um erro para cada conversação. Isso ocorre porque essas conversações não usam o identificador novo. Qualquer rota que referencia o antigo identificador do Service Broker deve ser recriada com o novo identificador.

  • ERROR_BROKER_CONVERSATIONS. Esta 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 termina todas as conversações no banco de dados e retorna um erro para cada conversação. 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 conversações abertas. Todas as conversações no banco de dados restaurado devem ser terminadas 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 tenham o mesmo identificador do Service Broker para que 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 anexação de bancos de dados, consulte CREATE DATABASE (Transact-SQL) e ALTER DATABASE (Transact-SQL). 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 (Transact-SQL).