Поделиться через


Основные сведения о параметрах сортировки и компоненте Service Broker

Компонент Service Broker разработан так, чтобы службы и приложения, относящиеся к экземплярам с разными настройками режима сопоставления, могли взаимодействовать просто и эффективно. База данных, в которой размещается служба, отправляющая сообщение, может иметь параметры сортировки, отличные от параметров сортировки базы данных службы, принимающей сообщение. Таким образом, при обработке имен компонент Service Broker использует одинаковые параметры сортировки независимо от параметров сортировки базы данных, где размещена служба. Чтобы исключить из процесса передачи данных сведения о параметрах сортировки, компонент Service Broker при сопоставлении имен служб, имен контрактов и имен типов сообщений выполняет побайтное сравнение. Сопоставляя имена как последовательности байтов, компонент Service Broker позволяет службам просто осуществлять правильный обмен сообщениями без дополнительных расходов, связанных с обменом данными о параметрах сортировки.

Побайтовое сопоставление фактически является двоичным сравнением без учета текущих параметров сортировки. По этой причине многие разработчики служб компонента Service Broker следуют рекомендациям, изложенным в разделе Задание имен для объектов компонента Service Broker. Приложение, соблюдающее эти рекомендации и обрабатывающее все имена с учетом регистра, будет правильно работать независимо от различий между параметрами сортировки, которые приняты в базах данных, где размещаются целевая служба и служба вызывающей стороны.

Параметры сортировки в очередях

В очередях используется одинаковые параметры сортировки независимо от параметров сортировки по умолчанию в экземпляре SQL Server или в базе данных, где размещается очередь. Если очередь фигурирует в инструкции SELECT, содержащей инструкцию JOIN для объединения с другой таблицы базы данных (например, с таблицей, служащей для поддержания состояния), иногда требуется явно указать параметры сортировки для сравнения.

Например, одним из требований к приложению может быть сохранение некоторых сообщений диалога до завершения этого диалога. Следующий образец кода Transact-SQL сохраняет все сообщения конкретного диалога, типы которых указаны в таблице 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

В инструкции SELECT явно указано, что при сопоставлении имен типов сообщений должно быть выполнено двоичное сравнение. Так как в очереди не используются параметры сортировки по умолчанию в базе данных, для успешного выполнения сравнения am.message_type_name = q.message_type_name необходимо предложение COLLATE. В этой инструкции указан двоичные параметры сортировки Latin1_General_BIN для обеспечения соответствия с методикой внутреннего сравнения, которую компонент Service Broker использует для сопоставления имен служб.

Параметры сортировки в приложениях

Компонент Service Broker передает текст сообщения как двоичные данные и не изменяет содержимое сообщения. Если приложения обмениваются данными, учитывающими параметры сортировки, любые различия между параметрами сортировки должны обрабатываться приложениями. В приложениях, обменивающихся текстом, обычно применяются типы Юникода для предотвращения проблем с параметрами сортировки.