Partilhar via


Noções básicas sobre agrupamento e Service Broker

Aplica-se a:SQL ServerAzure SQL Managed Instance

O Service Broker foi projetado para permitir que serviços e aplicativos em instâncias com diferentes configurações de agrupamento se comuniquem de forma fácil e eficiente. O banco de dados que hospeda um serviço que envia uma mensagem pode não usar o mesmo agrupamento que o banco de dados que hospeda o serviço que recebe a mensagem. Portanto, o Service Broker usa um agrupamento consistente para nomes, independentemente do agrupamento do banco de dados que hospeda o serviço. Para remover informações de ordenação do processo de comunicação, o Service Broker usa uma comparação byte a byte para alinhar nomes de serviço, nomes de contrato e nomes de tipo de mensagem. Ao sincronizar nomes como sequências de bytes, o Service Broker facilita a troca correta de mensagens entre serviços, sem a sobrecarga adicional de trocar informações de ordenação.

A correspondência byte-a-byte é efetivamente uma comparação binária que não considera o agrupamento atual. Por esse motivo, muitos serviços de corretagem acham conveniente seguir as recomendações em Naming Service Broker Objects. Uma aplicação que siga estas diretrizes e trate todos os nomes como sensíveis a maiúsculas e minúsculas deve funcionar corretamente, independentemente das diferenças na ordenação entre o banco de dados que hospeda o serviço de destino e o banco de dados que hospeda o serviço que inicia.

Considerações sobre agrupamento de filas

As filas usam um agrupamento consistente, independentemente do agrupamento padrão da instância do SQL Server ou do agrupamento padrão do banco de dados que hospeda a fila. Se uma fila for o destino de uma instrução SELECT que inclua uma instrução JOIN com outra tabela no banco de dados, como uma tabela usada para manter o estado, talvez seja necessário especificar explicitamente o agrupamento para a comparação.

Por exemplo, um aplicativo que usa retenção de mensagens pode precisar preservar algumas mensagens para uma conversa antes que o aplicativo termine a conversa. O exemplo de código Transact-SQL a seguir salva todas as mensagens, para uma determinada conversa, que têm um nome de tipo de mensagem na tabela AuditedMessageTypes.

    IF @messageTypeName =
      'https://schemas.microsoft.com/SQL/ServiceBroker/EndDialog'
    BEGIN
      INSERT INTO dbo.AuditRecord
        SELECT q.message_type_name, q.message_body
          FROM dbo.ApplicationQueue AS q
            JOIN dbo.AuditedMessageTypes AS am ON
                 am.message_type_name = q.message_type_name
                 COLLATE Latin1_General_BIN
               AND
                 q.conversation_handle = @conversationHandle
       END CONVERSATION @conversationHandle
    END

A instrução SELECT especifica explicitamente uma comparação binária para corresponder aos nomes dos tipos de mensagem. Como uma fila não usa o agrupamento padrão do banco de dados, a cláusula COLLATE é necessária para que a comparação am.message_type_name = q.message_type_name seja bem-sucedida. A instrução especifica um agrupamento binário, Latin1_General_BIN, para corresponder ao comportamento da comparação interna que o Service Broker usa para corresponder aos nomes de serviço.

Considerações sobre agrupamento de aplicativos

O Service Broker transmite o corpo da mensagem como dados binários e não modifica o conteúdo da mensagem. Se os aplicativos trocarem dados sensíveis ao agrupamento, os aplicativos deverão lidar com quaisquer diferenças de agrupamento. Os aplicativos que trocam texto geralmente usam tipos Unicode para ajudar a minimizar problemas de agrupamento.

Ver também