Service Broker 통신 프로토콜

적용 대상:SQL ServerAzure SQL Managed Instance

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에서 Broker로 메시지를 이동시킵니다.

대화 상자 프로토콜

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

대화의 양측은 대화 프로토콜 계층에서 각각 하나의 엔드포인트입니다. sys.conversation_endpoints 카탈로그 뷰는 대화 프로토콜 엔드포인트에 대한 정보를 보여 줍니다. 대화 엔드포인트는 대화의 수명 동안 존재합니다.

인접 Broker 프로토콜

인접 Broker 프로토콜 계층은 두 SQL Server 인스턴스 간의 통신 구조를 처리합니다. 이 계층은 각 메시지 조각을 네트워크를 통한 전송에 적합한 표준 형식으로 인코딩합니다. 대화 프로토콜 계층과 달리 인접 프로토콜 계층은 사용되는 네트워크 전송을 인식하고 메시지 조각의 형식을 적절하게 지정합니다. 실제로 인접한 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는 모든 사용자 정의 메시지 유형, 종료 대화 메시지, 애플리케이션에서 생성된 오류 메시지에 순차화된 메시지를 사용합니다. 시퀀스된 각 메시지에는 시퀀스 번호가 있습니다. 메시지를 시작하는 인스턴스는 메시지 시퀀스 번호를 만들고 메시지에 시퀀스 번호를 할당합니다. 수신 브로커는 메시지 시퀀스 번호를 사용하여 애플리케이션에 제공하는 메시지를 정렬합니다. 지정된 대화 상자의 경우 애플리케이션은 항상 시퀀스 번호가 가장 낮은 메시지를 먼저 받습니다. 또한 Service Broker는 메시지 시퀀스 번호를 사용하여 중복된 메시지를 검색합니다. 대화 프로토콜 계층이 동일한 시퀀스 번호가 있는 동일한 대화 상자에서 두 개의 메시지를 수신하는 경우 대화 프로토콜 계층은 메시지가 중복되고 카드 1로 간주합니다.

Service Broker는 Service Broker에서 만든 전용 승인 메시지 및 오류 메시지에 대해 순서가 지정되지 않은 메시지를 사용합니다. Service Broker는 순차화되지 않은 메시지를 배달하는 데 특별한 주의를 기울이지 않습니다. 그러나 Service Broker는 들어오는 메시지에 대한 응답으로 순차화되지 않은 메시지를 생성합니다. 따라서 큐에 찍지 않은 메시지가 손실되면 발신자는 원래 메시지를 다시 시도합니다. 그러면 받는 사람이 큐에 찍지 않은 다른 메시지를 생성합니다.

메시지 조각화

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

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

메시지가 다시 조립되는 동안 부분 메시지는 대상 큐에 저장됩니다. 대상 큐를 사용할 수 없는 경우 전송 큐에 저장됩니다. 애플리케이션에서 부분 메시지를 받을 수 없습니다. 부분 메시지의 상태 열은 2(사용 안 함)로 설정됩니다. 이 값은 잘못된 순서로 수신된 메시지에도 사용됩니다.

메시지 승인 수신

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

발신자는 수신자가 승인하지 않은 메시지 조각을 유지합니다. 시스템에 정의된 대기 시간 내에 승인을 받지 못하면 보낸 사람은 메시지 조각을 다시 보냅니다. 대기 시간 동안 승인을 받지 못하면 Service Broker는 다음 번 다시 시도까지의 대기 시간을 최대 대기 시간에 이를 때까지 기하급수적으로 증가시킵니다. 재시도에 대한 초기 대기 시간은 몇 초입니다. 최대 대기 시간은 약 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 network communication between two instances

대화는 영구적이고 논리적인 연결입니다. 대화는 일정 기간 동안 발생할 수 있으며, 해당 기간 동안 대화는 임의의 수의 네트워크 연결을 사용할 수 있습니다.

네트워크 연결은 두 Service Broker 엔드포인트 간에 발생합니다. 이러한 연결은 TCP/IP를 사용합니다. 짧은 기간 동안 연결이 비활성화되면 SQL Server가 네트워크 연결을 닫습니다.

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

참고 항목