다음을 통해 공유


데이터 정렬 및 Service Broker 이해

Service Broker는 데이터 정렬 구성이 다른 인스턴스의 서비스와 응용 프로그램이 쉽고 효율적으로 통신할 수 있도록 설계되었습니다. 메시지를 보내는 서비스를 호스팅하는 데이터베이스가 메시지를 받는 서비스를 호스팅하는 데이터베이스와 동일한 데이터 정렬을 사용하지 않을 수도 있습니다. 따라서 Service Broker는 서비스를 호스팅하는 데이터베이스의 데이터 정렬과 관계없이 이름에 대해 일관성 있는 데이터 정렬을 사용합니다. 통신 과정에서 데이터 정렬 정보를 제거하기 위해 Service Broker는 바이트 단위 비교를 통해 일치하는 서비스 이름, 계약 이름 및 메시지 유형 이름을 찾습니다. 바이트 시퀀스로 일치하는 이름을 찾으므로 서비스에서 데이터 정렬 정보를 교환하는 오버헤드 없이 메시지를 정확하고 간단하게 주고받을 수 있습니다.

바이트 단위 비교는 현재 데이터 정렬을 고려하지 않는 효율적인 이진 비교입니다. 따라서 많은 Broker 서비스에서 Service Broker 개체 이름 지정의 권장 사항을 따르는 것이 비교하는 데 도움이 됩니다. 이러한 지침을 따르고 모든 이름의 대/소문자를 구분하여 처리하는 응용 프로그램은 대상 서비스를 호스팅하는 데이터베이스와 시작 서비스를 호스팅하는 데이터베이스 간의 데이터 정렬이 달라도 올바르게 작동해야 합니다.

큐 데이터 정렬 고려 사항

큐에서는 SQL Server 인스턴스의 기본 데이터 정렬이나 큐를 호스팅하는 데이터베이스의 기본 데이터 정렬에 관계없이 일관성 있는 데이터 정렬이 사용됩니다. 큐가 데이터베이스의 다른 테이블(예: 상태 유지 관리에 사용하는 테이블)에 JOIN 문을 포함하는 SELECT 문의 대상이라면 비교에 대한 데이터 정렬을 명시적으로 지정해야 할 수도 있습니다.

예를 들어 메시지 보존을 사용하는 응용 프로그램은 응용 프로그램이 대화를 종료하기 전에 대화의 일부 메시지를 보존해야 할 수 있습니다. 다음 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 절이 필요합니다. 이 문은 Service Broker가 일치하는 서비스 이름을 찾기 위해 사용하는 내부 비교 동작에 해당하는 이진 데이터 정렬 Latin1_General_BIN을 지정합니다.

응용 프로그램 데이터 정렬 고려 사항

Service Broker는 메시지 본문을 이진 데이터로 전송하며 메시지 내용을 수정하지 않습니다. 응용 프로그램이 데이터 정렬 구분 데이터를 주고받을 경우에는 데이터 정렬상의 모든 차이점을 처리해야 합니다. 텍스트를 주고받는 응용 프로그램은 일반적으로 유니코드 유형을 사용하여 데이터 정렬 문제를 최소화합니다.