Compreendendo agrupamento e o Service Broker

O Agente de Serviços é projetado para permitir que serviços e aplicativos em instâncias com configurações de agrupamento diferentes se comuniquem fácil e eficientemente. 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. Assim, o Agente de Serviços usa um agrupamento consistente para nomes, independentemente do agrupamento do banco de dados que hospeda o serviço. Para remover informações de agrupamento do processo de comunicação, o Agente de Serviços usa uma comparação byte a byte para efetuar a correspondência de nomes de serviço, nomes de contrato e nomes de tipos de mensagem. Efetuando uma correspondência de nomes como seqüências de bytes, o Agente de Serviços simplifica a troca correta de mensagens para os serviços, sem a sobrecarga extra de troca de informações de agrupamento.

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 agente consideram conveniente seguir as recomendações em Nomeando objetos do Service Broker. Um aplicativo que segue essas diretrizes e trata todos os nomes diferenciando maiúsculas e minúsculas deve funcionar corretamente, a despeito das diferenças de agrupamento entre o banco de dados que hospeda o serviço de destino e o banco de dados que hospeda o serviço inicial.

Considerações sobre agrupamento de fila

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 inclui uma instrução JOIN com outra tabela no banco de dados, como uma tabela usada para manter estado, você pode ser solicitado para especificar explicitamente o agrupamento para a comparação.

Por exemplo, um aplicativo que usa retenção de mensagem pode ter de preservar algumas mensagens para uma conversação, antes que o aplicativo termine a conversação. O exemplo de código Transact-SQL a seguir salva todas as mensagens, para uma determinada conversação, que tem 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 correspondência com os nomes de tipo 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 tenha êxito. A instrução especifica um agrupamento binário, Latin1_General_BIN, que corresponda ao comportamento da comparação interna que o Agente de Serviços usa na correspondência de nomes de serviços.

Considerações sobre agrupamento de aplicativo

O Agente de Serviços transmite o corpo de mensagem como dados binários e não modifica o conteúdo da mensagem. Se os aplicativos trocarem dados que diferenciam agrupamentos, os aplicativos devem controlar qualquer diferença de agrupamento. Aplicativos que trocam texto geralmente usam tipos Unicode para ajudar a minimizar problemas de agrupamento.