대화 우선 순위

대화 우선 순위는 사용자 정의 규칙 집합입니다. 각 규칙은 우선 순위 수준을 지정하고 이 우선 순위 수준을 할당할 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

  • 이름이 SimpleContract인 계약. 이 계약은 InitiatorService에서 TargetServiceRequestMessages를 보내고 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는 우선 순위가 높은 메시지가 많을 경우 우선 순위가 낮은 메시지가 차단되는 현상을 방지하기 위해 기아 상태 방지(starvation prevention) 메커니즘을 사용합니다. 따라서 오랜 시간 동안 대기한 낮은 우선 순위의 메시지는 더 높은 우선 순위의 메시지가 큐에 있는 경우에도 전송될 수 있습니다.

개별 메시지 또는 메시지 조각이 우선 순위 순서와 다르게 전송될 수 있지만 많은 수의 메시지 전송에서 전체적으로 고려하면 그 영향은 미미합니다.