Service Bus 메시지 페이로드 및 serialization 살펴보기
메시지는 페이로드 및 메타데이터를 전달합니다. 메타데이터는 키-값 쌍 속성의 형태이며, 페이로드를 설명하고 Service Bus 및 애플리케이션에 처리 지침을 제공합니다. 경우에 따라 메타데이터만으로 보낸 사람이 수신자에게 제공하려는 정보를 전달하는 데 충분하며 페이로드는 빈 상태를 유지합니다.
.NET 및 Java에 대한 공식 Service Bus 클라이언트의 개체 모델은 Service Bus가 지원하는 와이어 프로토콜에/프로토콜로 매핑됩니다.
Service Bus 메시지는 Service Bus가 서비스 쪽에서 어떤 형식으로든 절대 처리하지 못하는 이진 페이로드 섹션과 2개의 속성 집합으로 이루어져 있습니다. broker 속성은 시스템 정의됩니다. 이러한 미리 정의된 속성은 브로커 내의 메시지 수준 기능을 제어하거나 일반적이고 표준화된 메타데이터 항목에 매핑됩니다. 사용자 속성은 애플리케이션에 의해 정의되고 설정될 수 있는 키-값 쌍의 컬렉션입니다.
메시지 라우팅 및 상관 관계
broker 속성의 하위 집합, 특히 To
, ReplyTo
, ReplyToSessionId
, MessageId
, CorrelationId
및 SessionId
은(는) 애플리케이션이 특정 대상으로 메시지를 라우팅하도록 합니다. 다음 패턴은 라우팅에 대해 설명합니다.
단순 요청/회신: 게시자는 메시지를 큐에 보내고 메시지 소비자의 회신을 기다립니다. 게시자는 회신을 받을 큐를 소유합니다. 해당 큐의 주소는 아웃바운드 메시지의
ReplyTo
속성에 포함됩니다. 소비자가 응답하면 처리된 메시지의MessageId
를 회신 메시지의CorrelationId
속성에 복사하여ReplyTo
속성에 표시된 대상으로 메시지를 전달합니다. 애플리케이션 컨텍스트에 따라 하나의 메시지가 여러 회신을 발생할 수 있습니다.멀티캐스트 요청/회신: 이전 패턴의 변형으로, 게시자는 토픽으로 메시지를 보내고 여러 구독자가 메시지를 사용할 수 있게 됩니다. 각 구독자는 앞에서 설명한 방식으로 응답할 수 있습니다.
ReplyTo
가 토픽을 가리키는 경우 이러한 검색 응답 세트를 대상 그룹에 배포할 수 있습니다.멀티플렉싱: 이 세션 기능을 사용하면 단일 큐 또는 구독을 통해 관련 메시지의 스트림을 멀티플렉싱하여 일치하는
SessionId
값으로 식별되는 관련 메시지의 각 세션 또는 그룹이 잠금 상태에서 수신자가 세션을 유지하는 동안 특정 수신자에게 라우팅됩니다. 여기에서 세션 세부 정보에 대해 자세히 읽어보세요.멀티플렉싱 요청/회신: 이 세션 기능은 멀티플렉싱 회신을 활성화하여 여러 게시자가 회신 큐를 공유할 수 있습니다. 게시자는
ReplyToSessionId
를 설정하여 한 명 이상의 소비자에게 해당 값을 회신 메시지의SessionId
속성에 복사하도록 지시할 수 있습니다. 게시 큐 또는 토픽은 세션을 인식할 필요가 없습니다. 메시지가 전송되면 게시자는 세션 수신자를 조건부로 수락하여 지정된SessionId
이(가) 있는 세션이 큐에서 구체화될 때까지 대기합니다.
Service Bus 네임스페이스의 라우팅은 자동 전달 체인 및 토픽 구독 규칙을 사용하여 실현될 수 있습니다. 네임스페이스 간의 라우팅은 Azure Logic Apps를 사용하여 수행할 수 있습니다. To
속성 사용 하도록 예약 됩니다. 라우팅을 구현하는 애플리케이션은 사용자 속성을 기준으로 구현해야 하며 To
속성에 의존하면 안 됩니다. 그렇지만 이렇게 해도 호환성 문제가 야기되지는 않습니다.
페이로드 serialization
전송 중이거나 Service Bus 내에 저장되어 있을 때 페이로드는 항상 불투명한 이진 블록입니다. ContentType
속성을 사용하면 애플리케이션은 속성 값에 대해 제안되는 형식을 IETF RFC2045에 따라 MIME 콘텐츠 형식 설명으로 지정(예: application/json;charset=utf-8
)하여 페이로드를 설명할 수 있습니다.
Java 또는 .NET Standard 변형과 달리 Service Bus API의 .NET Framework 버전은 임의의 .NET 개체를 생성자에 전달하여 BrokeredMessage
인스턴스 만들기를 지원합니다.
레거시 SBMP 프로토콜은 기본 이진 직렬 변환기로 또는 외부에서 제공되는 직렬 변환기를 사용해 개체를 직렬화합니다. AMQP 프로토콜은 AMQP 개체로 개체를 직렬화합니다. 수신자는 예상 유형을 제공하는 GetBody<T>()
메서드를 사용하여 해당 개체를 검색할 수 있습니다. AMQP를 사용하면 개체가 ArrayList
및 IDictionary<string,object>
개체의 AMQP 그래프로 직렬화되고 모든 AMQP 클라이언트가 이를 디코딩할 수 있습니다.
이 숨겨진 serialization 기능이 편리하긴 하지만, 애플리케이션은 개체 serialization을 명시적으로 제어하고, 개체 그래프를 스트림으로 전환한 다음, 메시지에 포함해야 하며, 수신자 쪽에서는 이러한 작업을 반대로 진행해야 합니다. AMQP는 강력한 이진 인코딩 모델을 사용하지만 AMQP 메시징 에코시스템에 연결되며 HTTP 클라이언트는 이러한 페이로드를 디코딩하기 어렵습니다.