이 섹션에서는 WCF(Windows Communication Foundation)에서 대기 중인 통신을 사용하는 방법을 설명합니다.
큐를 WCF 전송 바인딩으로 사용하기
WCF에서 계약은 교환되는 내용을 지정합니다. 계약은 비즈니스 종속 또는 애플리케이션별 메시지 교환입니다. 메시지를 교환하는 데 사용되는 메커니즘(또는 "방법")은 바인딩에 지정됩니다. WCF의 바인딩은 메시지 교환의 세부 정보를 캡슐화합니다. 사용자가 바인딩이 나타내는 전송 또는 프로토콜의 다양한 측면을 제어할 수 있도록 구성 노브를 노출합니다. WCF의 큐는 다른 모든 전송 바인딩처럼 처리되며 이는 많은 큐 애플리케이션에 큰 이점입니다. 현재 많은 큐 애플리케이션이 다른 RPC(원격 프로시저 호출) 스타일의 분산 애플리케이션과 다르게 작성되어 따라가고 유지 관리하기가 더 어려워집니다. WCF를 사용하면 분산 애플리케이션을 작성하는 스타일이 거의 동일하므로 더 쉽게 따르고 유지 관리할 수 있습니다. 또한 비즈니스 논리와 별도로 교환 메커니즘을 고려하면 애플리케이션별 코드에 영향을 주지 않고 전송을 구성하거나 변경하는 것이 더 쉽습니다. 다음 그림에서는 MSMQ를 전송으로 사용하는 WCF 서비스 및 클라이언트의 구조를 보여 줍니다.
앞의 그림에서 볼 수 있듯이 클라이언트와 서비스는 애플리케이션 의미 체계, 즉 계약 및 구현만 정의해야 합니다. 서비스는 선호하는 설정으로 대기열 바인딩을 구성합니다. 클라이언트는 ServiceModel 메타데이터 유틸리티 도구(Svcutil.exe) 를 사용하여 서비스에 대한 WCF 클라이언트를 생성하고 서비스에 메시지를 보내는 데 사용할 바인딩을 설명하는 구성 파일을 생성합니다. 따라서 대기 중인 메시지를 보내기 위해 클라이언트는 WCF 클라이언트를 인스턴스화하고 이에 대한 작업을 호출합니다. 이렇게 하면 메시지가 전송 큐로 전송되고 대상 큐로 전송됩니다. 큐에 대기 중인 통신의 모든 복잡성은 메시지를 보내고 받는 애플리케이션에서 숨겨집니다.
WCF의 큐에 대기 중인 바인딩에 대한 주의 사항은 다음과 같습니다.
WCF의 기본 큐 바인딩은 큐를 사용하는 이중 통신을 지원하지 않으므로 모든 서비스 작업은 단방향이어야 합니다. 양방향 통신 샘플(Two-Way Communication)은 두 개의 단방향 계약을 사용하여 큐를 사용하여 이중 통신을 구현하는 방법을 보여 줍니다.
메타데이터 교환을 사용하여 WCF 클라이언트를 생성하려면 WCF 클라이언트를 생성하고 바인딩 정보를 가져와 대기 중인 통신을 적절하게 구성하기 위해 직접 쿼리할 수 있도록 서비스에 추가 HTTP 엔드포인트가 필요합니다.
바인딩 대기열에 따라 WCF 외부에서 추가 구성이 필요합니다. 예를 들어 NetMsmqBinding WCF와 함께 제공되는 클래스를 사용하려면 바인딩을 구성하고 MSMQ(메시지 큐)를 최소한으로 구성해야 합니다.
다음 섹션에서는 MSMQ를 기반으로 하는 WCF와 함께 제공되는 특정 큐에 대기 중인 바인딩에 대해 설명합니다.
MSMQ
WCF의 큐 전송은 큐 통신에 MSMQ를 사용합니다.
MSMQ는 Windows에서 선택적 구성 요소로 제공하고 NT 서비스로 실행됩니다. 전송 큐의 전송 및 대상 큐의 배달을 위한 메시지를 캡처합니다. MSMQ 큐 관리자는 전송 시 메시지가 손실되지 않도록 신뢰할 수 있는 메시지 전송 프로토콜을 구현합니다. 프로토콜은 SRMP(SOAP Reliable Message Protocol)와 같은 네이티브 또는 SOAP 기반일 수 있습니다.
MSMQ에서 큐는 트랜잭션 또는 비 트랜잭션일 수 있습니다. 트랜잭션 큐를 사용하면 메시지를 캡처하여 트랜잭션에 전달한 다음 큐에 지속적으로 저장할 수 있습니다. 트랜잭션 큐로 전송된 메시지는 정확히 한 번 순서대로 전송됩니다. 비 트랜잭션 큐를 사용하여 휘발성 및 지속성 메시지를 모두 보낼 수 있습니다. 비트랜잭션 큐로 전송되는 메시지는 신뢰할 수 있는 전송 보증을 제공하지 않습니다. 따라서 메시지가 손실될 수 있습니다.
MSMQ 큐는 Active Directory 디렉터리 서비스에 등록된 Windows ID를 사용하여 보호될 수도 있습니다. MSMQ를 설치할 때 컴퓨터가 Windows 도메인 네트워크의 일부여야 하는 Active Directory 통합을 설치할 수 있습니다.
MSMQ에 대한 자세한 내용은 MSMQ(메시지 큐 설치)를 참조하세요.
NetMsmqBinding
<netMsmqBinding>은 WCF가 MSMQ를 사용하여 통신하는 두 개의 WCF 엔드포인트에 대해 제공하는 큐에 대기 중인 바인딩입니다. 따라서 바인딩은 MSMQ와 관련된 속성을 노출합니다. 그러나 모든 MSMQ 기능 및 속성이 에 NetMsmqBinding
노출되는 것은 아닙니다. 이 컴팩트 NetMsmqBinding
는 대부분의 고객을 만족시킬 수 있는 최적의 기능 집합으로 설계되었습니다.
바인딩 NetMsmqBinding
의 속성 형식으로 지금까지 설명한 핵심 큐 개념을 구현합니다. 이러한 속성은 메시지를 전송하고 전달하는 방법을 MSMQ와 통신합니다. 속성 범주에 대한 설명은 다음 섹션에 있습니다. 자세한 내용은 특정 속성을 보다 완벽하게 설명하는 개념 항목을 참조하세요.
ExactlyOnce 및 지속성 속성
및 ExactlyOnce
속성은 Durable
큐 간에 메시지를 전송하는 방법에 영향을 줍니다.
ExactlyOnce
: (기본값)으로true
설정하면 큐에 대기 중인 채널은 메시지가 배달된 경우 중복되지 않도록 합니다. 또한 메시지가 손실되지 않도록 합니다. 메시지를 배달할 수 없거나 메시지를 배달하기 전에 Time-To Live 메시지가 만료되면 배달 실패 이유와 함께 실패한 메시지가 죽은 메시지 큐에 기록됩니다. 로false
설정하면 대기 중인 채널이 메시지를 전송하기 위해 노력합니다. 이 경우 선택 사항으로 데드 레터 큐를 선택할 수 있습니다.Durable:
(기본값)으로true
설정하면 대기 중인 채널은 MSMQ가 메시지를 디스크에 지속적으로 저장하도록 합니다. 따라서 MSMQ 서비스를 중지하고 다시 시작하면 디스크의 메시지가 대상 큐로 전송되거나 서비스로 배달됩니다. 설정false
하면 메시지가 일시적 저장소에 저장되고 MSMQ 서비스를 중지하고 다시 시작할 때 손실됩니다.
신뢰할 수 있는 전송의 경우 ExactlyOnce
MSMQ를 사용하려면 큐가 트랜잭션이어야 합니다. 또한 MSMQ를 사용하려면 트랜잭션 큐에서 트랜잭션을 읽어야 합니다. 따라서 NetMsmqBinding
를 사용할 때는, ExactlyOnce
이 true
로 설정된 경우 메시지를 보내거나 받기 위해 트랜잭션이 필요하다는 점을 기억하세요. 마찬가지로 MSMQ는 시기 및 휘발성 메시징과 같은 ExactlyOnce
최상의 보증을 위해 큐가 트랜잭션이 아닌 큐여야 false
합니다. 따라서 ExactlyOnce
를 false
로 설정하거나 false
에 내구성을 설정한 경우, 트랜잭션을 사용하여 보내거나 받을 수 없습니다.
비고
바인딩의 설정에 따라 올바른 큐(트랜잭션 또는 비 트랜잭션)가 생성되었는지 확인합니다.
ExactlyOnce
이 true
인 경우, 트랜잭션 큐를 사용하고, 그렇지 않으면 비트랜잭션 큐를 사용합니다.
Dead-Letter 큐 속성
죽은 편지 큐 (dead-letter queue)는 배달에 실패한 메시지를 저장하는 데 사용됩니다. 사용자는 배달 못 한 편지 큐에서 메시지를 읽는 보상 논리를 작성할 수 있습니다.
많은 큐 시스템은 시스템 전체 데드 레터 큐를 지원합니다. MSMQ는 비 트랜잭션 큐로 전달되지 못한 메시지에 대해 시스템 차원의 비 트랜잭션 실패 메시지 큐를 제공하고, 트랜잭션 큐로 전달되지 못한 메시지에 대한 시스템 차원의 트랜잭션 실패 메시지 큐를 제공합니다.
여러 대상 큐에 메시지를 보내는 여러 클라이언트가 MSMQ 서비스를 공유하는 경우 클라이언트에서 보낸 모든 메시지는 동일한 배달 못 한 편지 큐로 이동합니다. 항상 바람직한 것은 아닙니다. 더 나은 격리를 위해 Windows Vista의 WCF 및 MSMQ는 사용자가 배달 실패 메시지를 저장하도록 지정할 수 있는 사용자 지정 배달 못 한 편지 큐(또는 애플리케이션별 배달 못 한 편지 큐)를 제공합니다. 따라서 다른 클라이언트는 동일한 데드 레터 큐를 공유하지 않습니다.
바인딩에는 다음과 같은 두 가지 속성이 있습니다.
DeadLetterQueue
: 이 속성은 배달 못한 편지 큐가 요청되었는지 여부를 나타내는 열거형입니다. 요청된 경우 열거에는 데드레터 큐의 유형도 포함됩니다. 값은None
,System
및Custom
입니다. 이러한 속성의 해석에 대한 자세한 내용은 Dead-Letter 큐를 사용하여 메시지 전송 실패 처리CustomDeadLetterQueue
: 이 속성은 애플리케이션별 데드 레터 큐의 URI(Uniform Resource Identifier) 주소입니다. 다음 경우에 필요합니다DeadLetterQueue
.Custom
가 선택됩니다.
포이즌 메시지 처리 속성
서비스에서 트랜잭션 아래의 대상 큐에서 메시지를 읽는 경우 서비스는 여러 가지 이유로 메시지를 처리하지 못할 수 있습니다. 그런 다음 메시지를 큐에 다시 넣어 다시 읽습니다. 반복적으로 실패하는 메시지를 처리하기 위해 바인딩에서 포이즌 메시지 처리 속성 집합을 구성할 수 있습니다. 네 가지 속성이 있습니다. ReceiveRetryCount
, MaxRetryCycles
, RetryCycleDelay
및 ReceiveErrorHandling
. 이러한 속성에 대한 자세한 내용은 포이즌 메시지 처리를 참조하세요.
보안 속성
MSMQ는 큐에 ACL(액세스 제어 목록) 또는 인증된 메시지 전송과 같은 자체 보안 모델을 노출합니다. 전송 NetMsmqBinding
보안 설정의 일부로 이러한 보안 속성을 노출합니다. 전송 보안을 위한 바인딩에는 두 가지 속성 MsmqAuthenticationMode
및 MsmqProtectionLevel
이 있습니다. 이러한 속성의 설정은 MSMQ를 구성하는 방법에 따라 달라집니다. 자세한 내용은 전송 보안을 사용하여 메시지 보안을 참조하세요.
전송 보안 외에도 실제 SOAP 메시지 자체는 메시지 보안을 사용하여 보호될 수 있습니다. 자세한 내용은 메시지 보안을 사용하여 메시지 보안을 참조하세요.
MsmqTransportSecurity
는 MsmqEncryptionAlgorithm
및 MsmqHashAlgorithm
두 개의 속성을 노출합니다. 이러한 항목은 메시지의 큐-큐 전송 암호화 및 서명 해시에 대해 선택할 수 있는 다양한 알고리즘의 열거형입니다.
기타 속성
이전 속성 외에도 바인딩에 노출된 다른 MSMQ 관련 속성에는 다음이 포함됩니다.
UseSourceJournal
: 원본 저널링이 켜져 있음을 나타내는 속성입니다. 원본 저널링은 전송 큐에서 성공적으로 전송된 메시지를 추적하는 MSMQ 기능입니다.UseMsmqTracing
: MSMQ 추적이 켜져 있음을 나타내는 속성입니다. MSMQ 추적은 메시지가 MSMQ 큐 관리자를 호스팅하는 컴퓨터에서 나가거나 도착할 때마다 보고서 큐로 보고서 메시지를 보냅니다.QueueTransferProtocol
: 큐 간 메시지 전송에 사용할 프로토콜의 열거형입니다. MSMQ는 네이티브 큐-큐 전송 프로토콜 및 SOAP SRMP(Reliable Messaging Protocol)라는 SOAP 기반 프로토콜을 구현합니다. SRMP는 큐 간 전송 시 HTTP 전송을 사용할 때 사용됩니다. SRMP 보안은 큐-큐 전송에 HTTPS를 사용할 때 사용됩니다.UseActiveDirectory
: Active Directory를 큐 주소 확인에 사용해야 하는지 여부를 나타내는 부울 값입니다. 기본적으로 해제되어 있습니다. 자세한 내용은 서비스 엔드포인트 및 큐 주소 지정을 참조하세요.
MsmqIntegrationBinding
MsmqIntegrationBinding
WCF 엔드포인트가 C, C++, COM 또는 System.Messaging API로 작성된 기존 MSMQ 애플리케이션과 통신하도록 하려는 경우에 사용됩니다.
바인딩 속성은 에 대한 NetMsmqBinding
속성과 동일합니다. 그러나 다음과 같은 차이점이 적용됩니다.
작업
MsmqIntegrationBinding
의 계약은 형식 매개 변수가 MsmqMessage<T> 본문 형식인 경우 단일 매개 변수만 사용할 수 있도록 제한됩니다.MSMQ 네이티브 메시지 속성의 대부분은 사용을 위해 MsmqMessage<T>에 노출됩니다.
메시지 본문의 직렬화 및 역직렬화를 돕기 위해 XML 및 ActiveX와 같은 serializer가 제공됩니다.
예제 코드
MSMQ를 사용하는 WCF 서비스를 작성하는 방법에 대한 단계별 지침은 다음 항목을 참조하세요.
WCF에서 MSMQ 사용을 보여 주는 완성된 코드 샘플은 다음 항목을 참조하세요.