대화 우선 순위

적용 대상:SQL ServerAzure SQL Managed Instance

대화 우선 순위는 사용자 정의 규칙 집합입니다. 각 규칙은 우선 순위 수준을 지정하고 이 우선 순위 수준을 할당할 Service Broker 대화를 결정하기 위한 조건을 지정합니다. 우선 순위 수준이 높은 대화의 메시지는 일반적으로 우선 순위 수준이 낮은 대화의 메시지보다 먼저 전송되거나 수신됩니다.

대화 우선 순위 활용법

대화 우선 순위를 사용하여 다음을 수행할 수 있습니다.

  • 다른 대화보다 우선 순위가 있는 대화를 식별합니다.

  • 더 높은 요금을 지불하는 고객의 메시지가 더 낮은 요금을 지불하는 고객의 메시지보다 전에 전송되는 다양한 서비스 계층을 지원합니다.

  • 백그라운드 작업보다 고객 요청을 선호합니다. 예를 들어 새 고객 등록은 비즈니스 트랜잭션 요약을 데이터 웨어하우스로 보내는 것보다 우선 순위가 높아야 합니다.

대화 우선 순위 및 대화 엔드포인트

대화 우선 순위는 CREATE BROKER PRIORITY 문을 사용하여 각 데이터베이스에 만들어집니다. 각 대화 우선 순위는 다음을 정의합니다.

  • 대화 우선 순위의 이름

  • Service Broker 대화를 할당하기 위한 우선 순위 수준 수준은 1(가장 낮음)에서 10(가장 높음)으로 정수로 지정됩니다. 기본값은 5입니다.

  • 우선 순위 수준이 다음에 적용되는 대화를 결정하는 조건입니다.

    • 계약 이름 또는 ANY입니다.

    • 로컬 서비스 이름 또는 ANY입니다.

    • 원격 서비스 이름 또는 ANY입니다.

Service Broker는 대화 엔드포인트가 생성될 때 해당 엔드포인트에 우선 순위 수준을 할당합니다. 각 대화에는 두 개의 대화 엔드포인트가 있습니다.

  • 시작자 대화 엔드포인트는 대화의 한쪽을 시작자 서비스 및 시작자 큐와 연결합니다. 시작자 대화 엔드포인트는 BEGIN DIALOG 문이 실행될 때 생성됩니다. 시작자 대화 엔드포인트와 연관된 작업에는 다음이 포함됩니다.

    • 시작자 서비스에서 보내기

    • 시작자 큐에서 받기

    • 시작자 큐에서 다음 대화 그룹 가져오기

  • 대상 대화 엔드포인트는 대화의 다른 한쪽을 대상 서비스 및 큐와 연결합니다. 대상 대화 엔드포인트는 초기자의 첫 번째 메시지가 대상 큐에 배치되면 만들어집니다. 대상 대화 엔드포인트와 연관된 작업에는 다음이 포함됩니다.

    • 대상 큐에서 받기

    • 대상 서비스에서 보내기

    • 대상 큐에서 다음 대화 그룹 가져오기

로컬 또는 원격 서비스로 평가되는 서비스는 대화 엔드포인트의 유형에 따라 달라집니다.

  • 초기자 대화 엔드포인트의 경우 초기자 서비스는 로컬 서비스이고 대상 서비스는 원격 서비스입니다.

  • 대상 대화 엔드포인트의 경우 대상 서비스는 로컬 서비스이고 초기자 서비스는 원격 서비스입니다.

Service Broker에서 우선 순위 수준을 할당하는 방법

Service Broker는 대화 엔드포인트가 생성될 때 대화 우선 순위 수준을 할당합니다. 대화 엔드포인트는 대화가 종료될 때까지 우선 순위 수준을 그대로 유지합니다. 새 우선 순위 또는 기존 우선 순위의 변경 사항은 기존 대화에 적용되지 않습니다.

Service Broker는 계약 및 서비스 조건이 엔드포인트의 속성에 가장 잘 일치하는 대화 우선 순위에서 대화 엔드포인트 우선 순위 수준을 할당합니다. 다음 표에서는 일치 우선 순위를 보여 줍니다.

엔드포인트 계약

엔드포인트 로컬 서비스

엔드포인트 원격 서비스

우선 순위 계약

우선 순위 로컬 서비스

우선 순위 원격 서비스

우선 순위 계약

우선 순위 로컬 서비스

ANY

우선 순위 계약

ANY

우선 순위 원격 서비스

우선 순위 계약

ANY

ANY

ANY

우선 순위 로컬 서비스

우선 순위 원격 서비스

ANY

우선 순위 로컬 서비스

ANY

ANY

ANY

우선 순위 원격 서비스

ANY

ANY

ANY

Service Broker는 먼저 지정된 계약, 로컬 서비스, 원격 서비스가 대화 엔드포인트에 사용된 것과 일치하는 우선 순위를 찾습니다. 이러한 우선 순위를 찾지 못한 경우 Service Broker는 엔드포인트에 사용된 것과 일치하는 계약 및 로컬 서비스가 있고 원격 서비스가 ANY로 지정된 우선 순위를 찾습니다. 이는 우선 순위 표에 나열된 다양한 변형 모두에 대해 계속 수행됩니다. 일치하는 항목이 발견되지 않으면 엔드포인트에 기본 우선 순위 5가 할당됩니다.

Service Broker 통신 프로토콜은 대화 엔드포인트 간에 우선 순위 수준을 전송하지 않습니다. Service Broker는 엔드포인트마다 개별적으로 우선 순위 수준을 할당합니다. Service Broker에서 시작자와 대상 대화 엔드포인트 모두에 우선 순위 수준을 할당하도록 하려면 두 엔드포인트에 대화 우선 순위가 적용되는지 확인해야 합니다. 시작자 대화 엔드포인트와 대상 대화 엔드포인트가 각기 다른 데이터베이스에 있는 경우 각 데이터베이스에 대화 우선 순위를 만들어야 합니다. 초기자와 대상 엔드포인트가 동일한 데이터베이스에 있는 경우:

  • 대화에서 사용하는 계약 이름과 로컬 및 원격 서비스 이름 모두에 대해 ANY를 지정하는 하나의 대화 우선 순위를 사용하여 두 대화 엔드포인트를 모두 처리할 수 있습니다.

  • 두 가지 대화 우선 순위를 사용하여 각 대화 엔드포인트를 개별적으로 다룰 수 있습니다.

    • LOCAL_SERVICE_NAME 초기자 서비스 이름과 REMOTE_SERVICE_NAME 대상 서비스 이름을 지정하는 초기자 엔드포인트에 대한 하나의 대화입니다.

    • LOCAL_SERVICE_NAME 대상 서비스 이름과 REMOTE_SERVICE_NAME 초기자 서비스 이름을 지정하는 대상 엔드포인트에 대한 하나의 대화입니다.

대화의 양쪽 엔드포인트에는 일반적으로 동일한 우선 순위 수준이 지정됩니다. 각 엔드포인트에 대해 서로 다른 우선 순위 수준을 지정할 수 있지만, 이렇게 한다고 해서 메시지가 다른 방향보다 한 방향으로 더 빠르게 전송되는 것은 아닙니다. 메시지는 한쪽의 대화 엔드포인트에서 전송되고 다른 한쪽의 엔드포인트에서 수신됩니다. 따라서 각 메시지 전송은 두 엔드포인트에 할당된 우선 순위 수준의 영향을 받습니다. 예를 들어 초기자 대화 엔드포인트의 우선 순위 수준이 10이고 대상 엔드포인트의 우선 순위 수준이 1이 되도록 대화를 구성할 수 있습니다. 이 경우 다음과 같습니다.

  • 우선 순위 수준 10을 사용하여 초기자 서비스에서 전송된 메시지는 우선 순위 수준 1을 사용하여 대상 큐에서 수신됩니다.

  • 우선 순위 수준 1을 사용하여 대상 서비스에서 전송되는 메시지는 우선 순위 수준 10을 사용하여 초기자 큐에서 수신됩니다.

대화 그룹에는 다음에 해당하는 모든 대화에 할당된 가장 높은 우선 순위 수준과 동일한 우선 순위 수준이 할당됩니다.

  • 대화는 그룹의 구성원입니다.

  • 대화에는 현재 서비스 큐에 메시지가 있습니다.

데이터베이스에 대화 우선 순위가 생성되어 있지 않은 경우에는 데이터베이스의 모든 대화 엔드포인트에 기본 우선 순위 5가 할당됩니다.

대화 우선 순위는 항상 기본 우선 순위 수준 5에서 작동하는 메시지 전달에 영향을 미치지 않습니다.

대화 우선 순위 예제

다음을 포함한 시스템을 고려하세요.

  • InitiatorServiceInitiatorQueue가 포함된 InitiatorDB.

  • TargetServiceTargetQueue가 포함된 TargetDB.

  • RequestMessagesInitiatorService에서 TargetService로 전송되도록 지정하는 이름이 SimpleContract인 계약. TargetService에서 InitiatorServiceReplyMessages를 보내도록 지정합니다.

이 스크립트는 초기자 대화 엔드포인트 및 관련 작업에 대한 우선 순위 수준을 지정합니다.

  • InitiatorService에서 TargetQueueRequestMessage의 SEND.

  • InitiatorQueue에서 ReplyMessage의 RECEIVE.

    USE InitiatorDB;
    GO
    CREATE BROKER PRIORITY InitiatorToTargetPriority
        FOR CONVERSATION
        SET (CONTRACT_NAME = SimpleContract,
             LOCAL_SERVICE_NAME = InitiatorSerivce,
             REMOTE_SERVICE_NAME = N'TargetService',
             PRIORITY_LEVEL = 3);
    GO

이 스크립트는 대상 대화 엔드포인트 및 관련 작업에 대한 우선 순위 수준을 지정합니다.

  • TargetQueue에서 RequestMessage의 RECEIVE.

  • TargetService에서 InitiatorQueueReplyMessage의 SEND.

    USE TargetDB;
    GO
    CREATE BROKER PRIORITY TargetToInitiatorPriority
        FOR CONVERSATION
        SET (CONTRACT_NAME = SimpleContract,
             LOCAL_SERVICE_NAME = TargetService,
             REMOTE_SERVICE_NAME = N'InitiatorService',
             PRIORITY_LEVEL = 3);
    GO

우선 순위 작동 방식

일반적으로 Service Broker는 우선 순위가 높은 대화의 메시지를 우선 순위가 낮은 대화의 메시지보다 먼저 보내고 받습니다. 우선 순위가 높은 대화의 메시지는 우선 순위가 낮은 대화의 메시지보다 큐에서 더 적은 시간을 보냅니다.

수신 우선 순위 수준

큐에서 메시지나 대화 그룹 식별자를 수신하는 작업에는 항상 우선 순위 수준이 적용됩니다.

우선 순위 수준은 RECEIVE에서 검색한 메시지 집합과 메시지가 검색되는 순서를 결정하는 요소 중 하나입니다.

  • 각 RECEIVE 문은 항상 한 대화 그룹에서 메시지를 검색합니다.

    • WHERE 절이 없는 RECEIVE는 큐에 메시지가 있는 우선 순위가 가장 높은 잠금 해제된 대화 그룹에 속하는 메시지를 검색합니다.

    • WHERE 절이 있는 RECEIVE는 WHERE 절에 지정된 대화 그룹에 대한 메시지를 검색합니다.

  • 대화 그룹 내에서 RECEIVE는 그룹의 대화 우선 순위 수준에 따라 메시지를 검색합니다. 우선 순위가 가장 높은 대화의 모든 메시지가 먼저 검색된 다음, 다음으로 높은 우선 순위 수준을 가진 대화에 대한 메시지 등을 검색합니다.

  • 대화 내에서 메시지는 전송된 것과 동일한 순서로 검색됩니다.

GET CONVERSATION GROUP은 큐에 메시지가 있는 잠금 해제된 그룹 집합에서 우선 순위가 가장 높은 그룹을 반환합니다.

전송 우선 순위 수준

인스턴스에 대한 전송 큐에 있는 메시지는 다음을 기반으로 하여 순서대로 전송됩니다.

  • 연결된 대화 엔드포인트의 우선 순위 수준

  • 우선 순위 수준 내에서 대화에 있는 해당 메시지의 보내기 순서

Service Broker는 데이터베이스 엔진 인스턴스의 모든 전송 큐에서 우선 순위 수준을 조정합니다. Service Broker는 먼저 모든 전송 큐의 우선 순위 10개 대화에서 메시지를 전송한 다음 우선 순위 9개 대화의 메시지를 전송합니다.

메시지 성능의 상대적 차이는 우선 순위 수준의 차이로 증가합니다. 9와 10과 같이 인접한 두 우선 순위 수준을 사용하는 시스템에서는 우선 순위 수준이 높은 메시지가 성능이 약간 향상됩니다. 1과 10과 같이 크게 구분된 두 개의 우선 순위 수준을 사용하는 시스템에서는 우선 순위 수준이 높은 메시지가 더 큰 성능 이점을 갖습니다. 여러 우선 순위 수준을 사용하는 시스템에서 대부분의 처리는 상위 2 또는 3개의 우선 순위 수준에 할당됩니다.

대화 우선 순위에 지정된 우선 순위 수준은 HONOR_BROKER_PRIORITY 데이터베이스 옵션이 ON으로 설정된 경우에만 전송 큐의 메시지에 적용됩니다. HONOR_BROKER_PRIORITY 옵션이 OFF로 설정되면 해당 데이터베이스에 대한 전송 큐의 모든 메시지에 기본 우선 순위 수준 5가 사용되어 전송됩니다. sys.transmission_queue를 사용하여 보면 메시지는 여전히 엔드포인트에서 받은 우선 순위 수준을 표시하지만 메시지를 전송하는 데는 기본 우선 순위 수준이 사용됩니다.

우선 순위 수준은 전송 큐의 메시지에 적용되므로 일반적으로 데이터베이스 엔진 동일한 인스턴스의 서비스 간에 전송되는 메시지에는 영향을 미치지 않습니다. 동일한 인스턴스의 서비스로 전송되는 메시지는 전송 큐를 거치지 않고 서비스의 큐에 직접 배치됩니다. 일부 조건에서는 일부 유형의 오류 또는 대상 큐가 비활성 상태인 등의 로컬 메시지가 전송 큐에 배치될 수 있습니다. 메시지가 전송 큐에 저장되면 관련 우선 순위 수준이 적용됩니다.

메시지 및 메시지 조각은 우선 순위에서 벗어날 수 있습니다.

  • Service Broker는 데이터베이스 엔진 인스턴스 간 메시지를 메시지 조각 블록을 사용하여 전송합니다. 우선 순위가 다른 여러 메시지 조각이 하나의 인스턴스로 보낼 준비가 된 경우 Service Broker는 모든 조각을 한 블록에 보낼 수 있습니다. 블록 끝에 있는 일부 조각은 다른 인스턴스로 전송을 기다리는 메시지 조각보다 우선 순위 수준이 낮을 수 있습니다.

  • Service Broker는 우선 순위가 높은 메시지가 많을 경우 우선 순위가 낮은 메시지가 차단되는 현상을 방지하기 위해 기아 상태 방지 메커니즘을 사용합니다. 큐에 우선 순위가 높은 메시지가 있더라도 오랫동안 대기해 온 낮은 우선 순위 메시지를 보낼 수 있습니다.

개별 메시지 또는 메시지 조각은 우선 순위에서 벗어날 수 있지만 많은 메시지 전송에서 고려할 때 효과는 작아야 합니다.

참고 항목