Service Broker 통신 프로토콜

Service Broker는 Broker별 프로토콜을 사용하여 원격 Broker와 통신합니다. Broker는 일반 클라이언트 연결 풀과는 별도로 연결을 관리합니다. 두 개의 SQL Server 인스턴스가 Service Broker 메시지를 교환하려면 각 인스턴스가 다른 인스턴스에서 Service Broker 통신에 사용하는 포트로 TCP/IP 트래픽을 보낼 수 있어야 합니다. 규칙에 따라 Service Broker는 Broker 간 통신에 포트 4022를 주로 사용합니다. 그러나 정확한 포트는 끝점이 생성될 때 지정됩니다.

프로토콜 계층

Service Broker는 계층 방식을 사용하여 통신합니다. 각 계층은 기본 계층을 바탕으로 하여 안정적인 배달을 보장합니다. 이러한 방식을 통해 응용 프로그램은 원격 서비스 위치나 Broker가 통신에 사용하는 물리적인 전송을 알지 못해도 작동할 수 있습니다. 대부분의 경우 이러한 프로토콜은 응용 프로그램을 인식하지 못합니다. 그러나 각 프로토콜 계층의 역할을 이해하면 응용 프로그램의 문제 해결에 도움이 될 수 있습니다.

Broker가 사용하는 가장 높은 수준의 프로토콜은 대화 프로토콜입니다. 대화 프로토콜 계층은 안정적이고 순차화된 메시지 전송을 처리합니다. 대화 프로토콜 계층은 메시지의 시퀀스 번호를 생성하고, 승인 메시지를 생성하며, 메시지를 해당 큐로 배달하고, 메시지를 조각화하고 다시 결합합니다. 대화 프로토콜은 대화에 대한 인증과 암호화를 처리합니다.

대화 프로토콜은 인접 Broker 프로토콜을 사용하여 메시지 조각을 전송합니다. 인접 Broker 프로토콜은 두 Broker 인스턴스 간에 주고받는 네트워크 전송을 처리합니다.

인접 Broker 프로토콜은 TCP/IP 같은 전송 프로토콜을 사용하여 메시지를 Broker 간에 이동합니다.

대화 프로토콜

대화 프로토콜은 대화의 메시지에 대해 EOIO(Exactly-Once-In-Order) 방식의 배달 패턴을 관리합니다. 이 프로토콜은 Service Broker 메시지가 네트워크에서 사용하는 형식을 설명하지 않습니다. 대신 안정적인 대화에 필요한 논리적인 단계를 지정합니다. 대화 프로토콜은 승인 메시지 생성 및 처리를 비롯하여 안정적인 배달에 필요한 태스크를 처리합니다.

대화의 양측은 대화 프로토콜 계층에서 각각 하나의 끝점입니다. sys.conversation_endpoints 카탈로그 뷰는 대화 프로토콜 끝점에 대한 정보를 보여 줍니다. 대화 끝점은 대화의 수명이 유지되는 동안 존재합니다.

인접 Broker 프로토콜

인접 Broker 프로토콜 계층은 두 SQL Server 인스턴스 간의 통신 구조를 처리합니다. 이 계층은 각 메시지 조각을 네트워크 전송에 적합한 표준 형식으로 인코딩합니다. 인접 protocol 계층은 대화 프로토콜 계층과는 달리 사용된 네트워크 전송을 인식하며 메시지 조각에 적절한 형식을 지정합니다. 실제로 인접 Broker 프로토콜 계층은 대화 프로토콜 계층과 전송 프로토콜 계층 간에 추상화 계층을 제공합니다.

각 Service Broker 네트워크 연결은 인접 프로토콜 계층의 끝점입니다. 동적 관리 뷰 sys.dm_broker_connections는 Service Broker 네트워크 연결에 대한 정보를 보여 줍니다. Service Broker는 메시지를 활발히 주고받는 동안 네트워크 연결을 유지합니다. Service Broker는 짧은 기간 동안 네트워크 연결을 통해 주고받은 메시지가 없으면 네트워크 연결을 닫습니다.

전송 프로토콜

전송 프로토콜 계층은 실제 네트워크 전송을 처리합니다. 이 계층은 Service Broker 외부에 있습니다. 예를 들어 다른 SQL Server 인스턴스에서 실행되는 Broker에 대한 메시지에는 TCP/IP가 전송 프로토콜 계층으로 사용됩니다.

Service Broker 끝점은 전송 프로토콜에 대한 옵션을 설정합니다. SQL Server에는 기본적으로 Service Broker 끝점이 포함되지 않습니다. Service Broker 끝점을 만드는 방법은 방법: Service Broker 네트워킹 활성화(Transact-SQL)를 참조하십시오.

Service Broker 메시지 처리

Service Broker는 두 가지 고유한 범주의 메시지를 사용합니다. 순차화된 메시지는 응용 프로그램에 순서대로 정확히 한 번만 배달되어야 하는 메시지입니다. 순차화되지 않은 메시지는 메시지가 도착하는 순서에 관계없이 즉시 처리할 수 있는 메시지입니다.

Service Broker는 모든 사용자 정의 메시지 유형, 종료 대화 메시지 및 응용 프로그램에서 생성된 오류 메시지에 순차화된 메시지를 사용합니다. 순차화된 각 메시지에는 시퀀스 번호가 있습니다. 메시지를 시작하는 인스턴스는 메시지 시퀀스 번호를 생성하고 이 시퀀스 번호를 메시지에 할당합니다. 받는 Broker는 메시지 시퀀스 번호를 사용하여 응용 프로그램에 제공하는 메시지의 순서를 지정합니다. 지정된 대화에 대해 응용 프로그램은 가장 낮은 시퀀스 번호를 가진 메시지를 항상 먼저 받습니다. 또한 Service Broker는 메시지 시퀀스 번호를 사용하여 중복된 메시지를 검색합니다. 대화 프로토콜 계층이 동일한 대화에 대해 동일한 시퀀스 번호를 가진 메시지 두 개를 받으면 대화 프로토콜 계층은 이 두 메시지를 중복된 것으로 간주하고 하나를 삭제합니다.

Service Broker는 Service Broker에서 생성된 전용 승인 메시지와 오류 메시지에 순차화되지 않은 메시지를 사용합니다. Service Broker는 순차화되지 않은 메시지를 배달하는 데 특별한 주의를 기울이지 않습니다. 그러나 Service Broker는 들어오는 메시지에 대한 응답으로 순차화되지 않은 메시지를 생성합니다. 따라서 순차화되지 않은 메시지가 손실되면 보낸 사람은 원래 메시지를 다시 시도하고 받는 사람은 순차화되지 않은 또 다른 메시지를 생성합니다.

메시지 조각화

Service Broker는 보내는 메시지를 여러 조각으로 나누고 들어오는 조각들을 원래 메시지로 결합합니다. 작은 메시지의 경우는 전체 메시지가 하나의 조각에 포함됩니다. 큰 메시지의 경우는 Service Broker가 많은 조각을 만듭니다.

메시지를 조각화하면 여러 가지 이점이 있습니다. 큰 메시지를 여러 개의 작은 조각으로 보내면 WAN(광역 통신망)처럼 상대적으로 느리고 불안정한 네트워크를 통해 통신할 때 전체 속도와 안정성이 높아집니다. 메시지 조각 하나가 손실되면 프로토콜은 전체 메시지가 아닌 해당 조각만 다시 전송합니다. 큰 메시지를 조각화하면 작은 메시지가 대상에 도달하는 데 필요한 시간도 단축할 수 있습니다. Service Broker는 작은 메시지 전체가 포함된 조각 하나를 큰 메시지의 조각들 사이에 보낼 수 있습니다. 이 경우 작은 메시지의 전송 대기 시간을 줄이기 위해 큰 메시지의 속도가 조금 느려집니다.

메시지가 다시 결합되는 동안에는 대상 큐에 부분 메시지가 저장됩니다. 대상 큐를 사용할 수 없는 경우에는 전송 큐에 저장됩니다. 응용 프로그램은 부분 메시지를 받을 수 없습니다. 부분 메시지의 status 열은 2(사용 안 함)로 설정됩니다. 이 값은 순서 없이 수신된 메시지에도 사용됩니다.

메시지 승인

Service Broker는 수신되는 모든 메시지를 승인합니다. 승인을 사용하면 하나 이상의 메시지 조각을 승인할 수 있습니다. 가능한 경우 승인은 동일한 대화에 대해 반환되는 메시지의 헤더에 포함됩니다. 다른 메시지를 보낼 준비가 되지 않은 경우 Service Broker는 전용 승인 메시지를 반환합니다. 메시지 승인은 전적으로 Service Broker에서 처리되며 Service Broker를 사용하는 응용 프로그램은 이러한 메시지를 받지 않습니다.

보낸 사람은 받는 사람이 승인되지 않은 메시지 조각을 보유합니다. 시스템에 정의된 대기 시간 내에 승인을 받지 못하면 보낸 사람은 메시지 조각을 다시 보냅니다. 대기 시간 동안 승인을 받지 못하면 Service Broker는 다음 번 다시 시도까지의 대기 시간을 최대 대기 시간에 이를 때까지 기하급수적으로 증가시킵니다. 다시 시도하기 위한 초기 대기 시간은 2~3초이며 최대 대기 시간은 약 1분입니다. 대기 시간이 엄밀하게 준수되지는 않습니다. 네트워크 트래픽과 SQL Server 인스턴스의 다른 활동에 따라 대기 시간이 만료된 후 몇 초 동안 메시지 조각이 다시 시도되지 않을 수도 있습니다.

승인이 손실되거나 지연되면 받는 사람이 중복된 메시지를 받을 수 있습니다. 이 경우 받는 사람은 중복된 메시지의 수신을 승인하지만 중복된 메시지를 큐로 배달하지는 않습니다.

Service Broker는 메시지 승인을 사용하여 분산 트랜잭션 없이도 안정적인 메시징을 제공합니다. 받는 사람은 메시지 또는 메시지 조각을 큐에 추가한 후에만 승인을 보낼 수 있습니다. 보낸 사람은 메시지 승인이 도착할 때까지 해당 메시지를 전송 큐에 보유합니다. 보낸 사람과 받는 사람이 트랜잭션을 공유하지는 않지만 프로토콜은 받는 사람이 메시지를 성공적으로 받을 때까지 보낸 사람이 해당 메시지를 전송 큐에서 제거하지 않음을 보장합니다.

메시지 무결성 검사

Service Broker가 메시지를 전송할 때 사용하는 형식에는 지정된 메시지가 전송 중에 변경되거나 손상되었는지 여부를 확인하기 위한 무결성 검사가 포함됩니다.

메시지 무결성 검사는 메시지 내용에 대한 MD5 서명입니다. SQL Server는 메시지에 대한 세션 키를 사용하여 서명을 암호화하고 서명을 메시지 머리글에 포함합니다.

메시지에 대한 대상은 메시지 암호를 해독한 다음 메시지의 서명을 실제로 받은 내용을 통해 계산한 새 서명과 비교합니다. 서명이 일치하지 않으면 메시지가 전송 중에 손상되었거나 변경된 것입니다. 메시지의 무결성 검사에 오류가 발생합니다. SQL Server는 해당 메시지를 삭제하고 보낸 사람에게 해당 메시지를 승인하지 않습니다. Broker:Corrupted Message 이벤트 클래스는 메시지 무결성 검사가 실패할 경우 정보를 보고합니다.

Service Broker 전송 개체

Service Broker 전송 개체는 대화의 메시지 전송 상태를 관리 및 기록하는 메모리 내 개체입니다. 각 대화 끝점에는 하나의 전송 개체가 있습니다.

대화는 다음과 같은 작업을 수행할 때 전송 개체를 요청합니다.

  • 전송 큐를 통해 메시지를 보냅니다. 여기에는 다음이 포함됩니다.

    • 원격 데이터베이스 엔진 인스턴스로 보내는 모든 메시지

    • 대상 큐에 직접 삽입이 불가능한 경우 로컬 인스턴스의 큐로 전송되는 메시지

  • 원격 메시지 또는 로컬 전송 큐에서 가져온 메시지를 받습니다.

전송 개체는 대화에서 요청할 때 처음으로 생성됩니다. Service Broker는 해당 대화의 이후 요청에 대해 모두 동일한 전송 개체를 사용합니다. Service Broker가 대화의 메시지 전송 상태에 변경 사항을 기록해야 할 때마다 전송 개체가 수정됩니다. 전송 개체의 크기는 약 1KB입니다.

메모리를 늘리기 위해 Service Broker는 정기적으로 비활성 전송 개체의 일괄 처리를 tempdb 작업 테이블에 저장합니다. 전송 개체가 메모리 내에서 처음으로 수정되면 이 개체는 커밋되지 않은 것으로 표시됩니다. 전송 개체는 작업 테이블로 플러시될 때까지 이 표시를 유지합니다.

전송 개체는 대상 큐로 직접 삽입될 수 있는 로컬 메시지를 주고받는 데는 사용되지 않습니다.

네트워크 통신 흐름

다음 그림에서는 두 SQL Server 인스턴스 간의 Service Broker 네트워크 통신을 개괄적으로 보여 줍니다.

두 인스턴스 간 Broker 네트워크 통신

대화는 지속적인 논리 연결입니다. 대화가 수행되는 기간에는 제한이 없으며 이 기간 동안 대화에 사용되는 네트워크 연결 수에도 제한이 없습니다.

두 Service Broker 끝점 사이에 네트워크 연결이 이루어지며 이러한 연결에는 TCP/IP가 사용됩니다. 짧은 기간 동안 연결이 비활성화되면 SQL Server가 네트워크 연결을 닫습니다.

메시지를 배달하기 위해 Service Broker는 메시지를 보낸 데이터베이스에 대한 전송 큐에 메시지를 보관합니다. 받는 사람은 대상 서비스 큐에 메시지를 직접 배달합니다. 큐가 OFF 상태이면 메시지는 받는 데이터베이스에 대한 전송 큐에 일시적으로 보유됩니다. 보내는 서비스에 대한 큐는 작업에 사용되지 않습니다. 받는 서비스를 호스팅하는 데이터베이스에 대한 전송 큐는 대상 큐가 OFF 상태인 경우에만 사용됩니다.

참고 항목

개념