MSMQ(Microsoft Message Queue)를 사용하면 애플리케이션 개발자는 메시지를 주고받으며 빠르고 안정적으로 애플리케이션과 쉽게 통신할 수 있습니다. 메시지 처리는 메시지 전달을 보장하고 많은 비즈니스 프로세스를 수행할 수 있는 안정적이고 안전한 방법을 제공합니다.
MSMQ는 XML Web Services 및 .Net Remoting과 마찬가지로 분산 개발 기술입니다. 그러나 XML 웹 서비스 또는 .Net Remoting 구성 요소를 사용하는 경우 클라이언트는 서버와 실시간으로 정보를 교환해야 하며 서버는 온라인 상태를 유지해야 합니다. MSMQ는 서버가 오프라인일 때 작동하여 클라이언트의 메시지 큐에 메시지를 임시로 저장한 다음 나중에 온라인 상태가 되면 처리를 위해 서버로 보냅니다.
분명히 MSMQ는 클라이언트가 서버로부터 시기적절한 응답을 요구하는 상황에는 적합하지 않습니다. MSMQ는 비동기 방식으로 서버와 상호 작용하므로 서버가 응답을 처리할 때까지 기다리는 것에 대해 걱정할 필요가 없습니다. 오랫동안.
XML Web Services와 .Net Remoting 모두 비동기 호출을 처리하기 위한 [OneWay] 속성을 제공하지만, 이는 서버 측의 긴 메서드 호출이 클라이언트를 방해하는 문제를 해결하는 데 사용됩니다. 오랫동안 옆에서. 그러나 이 때 서버는 요청을 처리하는 것보다 더 빨리 요청을 수락합니다.
일반적으로 전문 메시징 서비스에서는 [OneWay] 속성을 사용하지 않습니다.
1. 기본 용어 및 개념
"메시지"는 두 컴퓨터 간에 전송되는 데이터 단위입니다. 메시지는 텍스트 문자열만 포함하여 매우 단순할 수도 있고, 포함된 개체를 포함할 정도로 더 복잡할 수도 있습니다.
메시지가 대기열로 전송됩니다. "메시지 큐"는 전송 중에 메시지를 저장하는 컨테이너입니다. 메시지 큐 관리자는 소스에서 대상으로 메시지를 중계할 때 중개자 역할을 합니다. 대기열의 주요 목적은 라우팅을 제공하고 메시지 전달을 보장하는 것입니다. 메시지가 전송될 때 수신자를 사용할 수 없는 경우 Message Queue는 메시지가 성공적으로 전달될 때까지 메시지를 보관합니다.
"메시지 큐"는 컴퓨터에 관계없이 Microsoft Windows가 설치된 모든 컴퓨터 조합에서 모든 응용 프로그램에 메시지 처리 및 메시지 큐 기능을 제공하는 Microsoft의 메시지 처리 기술입니다. 동일한 네트워크 또는 온라인에서 동시에.
"메시지 큐 네트워크"는 서로 메시지를 주고받을 수 있는 컴퓨터 그룹입니다. 네트워크의 여러 컴퓨터는 메시지가 원활하게 처리되도록 하는 데 있어 서로 다른 역할을 수행합니다. 그 중 일부는 메시지 전송 방법을 결정하는 라우팅 정보를 제공하고 일부는 전체 네트워크에 대한 중요한 정보를 보유하며 일부는 단지 메시지를 보내고 받기만 합니다.
Message Queuing을 설치하는 동안 관리자는 서로 통신할 수 있는 서버를 결정하고 특정 서버에 대한 특별한 역할을 설정합니다. 이 메시지 큐 네트워크를 구성하는 컴퓨터를 사이트라고 하며 사이트 링크를 통해 서로 연결됩니다. 각 사이트 링크에는 관리자가 결정하고 사이트 링크를 통해 메시지가 전달되는 빈도를 나타내는 관련 "비용"이 있습니다.
또한 "메시지 큐" 관리자는 네트워크에서 하나 이상의 컴퓨터를 "라우팅 서버"로 설정합니다. 라우팅 서버는 여러 사이트를 통해 메시지를 전달하는 가장 빠르고 효율적인 방법을 결정하기 위해 각 사이트 링크의 비용을 확인하여 메시지 전달 방법을 결정합니다.
2. 대기열 유형
귀하 또는 네트워크에서 다른 사용자가 생성한 대기열과 시스템 대기열의 두 가지 주요 대기열 유형이 있습니다.
사용자가 만든 대기열은 다음 대기열 중 하나일 수 있습니다.
"공개 대기열"은 메시지 대기열 네트워크 전체에 복제되며 잠재적으로 네트워크에 연결된 모든 사이트에서 액세스할 수 있습니다.
"개인 대기열"은 네트워크 전체에 게시되지 않습니다. 대신, 해당 파일이 있는 로컬 컴퓨터에서만 사용할 수 있습니다. 개인 큐는 큐의 전체 경로 이름이나 레이블을 알고 있는 애플리케이션에서만 액세스할 수 있습니다.
"관리 대기열"에는 지정된 "메시지 대기열" 네트워크에서 전송된 메시지에 대한 수신을 확인하는 메시지가 포함됩니다. MessageQueue 구성 요소가 사용할 관리 대기열(있는 경우)을 지정합니다.
"응답 큐"에는 대상 애플리케이션이 메시지를 수신할 때 보내는 애플리케이션에 반환되는 응답 메시지가 포함됩니다. MessageQueue 구성 요소가 사용할 응답 큐(있는 경우)를 지정합니다.
시스템 생성 대기열은 일반적으로 다음 범주로 구분됩니다.
"저널 대기열"은 선택적으로 전송된 메시지의 복사본과 대기열에서 제거된 메시지의 복사본을 저장합니다. 각 메시지 큐 클라이언트의 단일 저널 큐는 해당 컴퓨터에서 보낸 메시지의 복사본을 저장합니다. 각 대기열에 대해 서버에 별도의 저널 대기열이 생성됩니다. 이 저널은 이 큐에서 제거된 메시지를 추적합니다.
"배달 못한 편지 대기열"은 배달할 수 없거나 만료된 메시지의 복사본을 저장합니다. 만료되었거나 배달할 수 없는 메시지가 트랜잭션 메시지인 경우 "트랜잭션 배달 못한 편지 큐"라고 하는 특별한 배달 못한 편지 큐에 저장됩니다. 배달 못한 편지는 만료된 메시지와 동일한 컴퓨터에 저장됩니다. 제한 시간 및 만료된 메시지에 대한 자세한 내용은 기본 메시지 속성을 참조하세요.
"보고 대기열"에는 메시지가 대상에 도달하는 데 걸린 경로를 나타내는 메시지가 포함되어 있으며 테스트 메시지도 포함될 수 있습니다. 컴퓨터당 하나의 보고서 대기열만 있을 수 있습니다.
"개인 시스템 대기열"은 메시지 처리 작업을 수행하기 위해 시스템에 필요한 관리 및 알림 메시지를 저장하는 일련의 전용 대기열입니다.
애플리케이션에서 수행되는 대부분의 작업은 공개 대기열 및 해당 메시지에 액세스하는 것과 관련됩니다. 그러나 애플리케이션의 로깅, 승인 및 기타 특수 처리 요구 사항에 따라 일상적인 작업에서 여러 가지 다른 시스템 대기열을 사용할 가능성이 높습니다.
3. 동기식 통신과 비동기식 통신
큐 통신은 본질적으로 비동기식입니다. 큐에서 메시지를 주고받는 과정이 다른 프로세스에서 이루어지기 때문입니다. 또한 메시지를 수신하려는 사람이 지정된 큐에서 BeginReceive 메서드를 호출한 다음 응답을 기다리지 않고 즉시 다른 작업을 계속할 수 있으므로 수신 작업을 비동기식으로 수행할 수 있습니다. 이는 사람들이 "동기식 통신"이라고 알고 있는 것과는 매우 다릅니다.
동기식 통신에서 요청 발신자는 다른 작업을 수행하기 전에 의도된 수신자의 응답을 기다려야 합니다. 발신자가 기다리는 시간은 전적으로 수신자가 요청을 처리하고 응답을 보내는 데 걸리는 시간에 따라 달라집니다.
4. 메시지 대기열과 상호 작용
메시지 처리 및 메시징은 서버 기반 애플리케이션 구성 요소 간의 강력한 프로세스 간 통신을 제공하는 유연한 메커니즘입니다. 구성 요소 간 직접 호출에 비해 다음과 같은 몇 가지 장점이 있습니다.
안정성 - 메시지가 대기열에 저장되고 항상 사용 가능하므로 구성 요소 오류가 메시지에 미치는 영향이 구성 요소 간 직접 호출보다 훨씬 적습니다. 적절하게 폐기될 때까지. 메시지 처리는 메시지 처리가 보장된다는 점에서 트랜잭션 처리와 유사합니다.
메시지 우선 순위 - 더 긴급하거나 중요한 메시지를 덜 중요한 메시지보다 먼저 수신할 수 있으므로 중요한 애플리케이션에 대한 적절한 응답 시간이 보장됩니다.
오프라인 기능 - 메시지가 전송되면 임시 대기열로 전송되어 성공적으로 전달될 때까지 해당 대기열에 남아 있을 수 있습니다. 어떤 이유로든 필요한 대기열에 액세스할 수 없는 경우 사용자는 계속해서 작업을 수행할 수 있습니다. 한편, 네트워크 연결이 복구되면 메시지 전달이 보장되므로 메시지가 처리된 것처럼 다른 작업을 계속할 수 있습니다.
트랜잭션 메시지 처리 — 여러 관련 메시지를 단일 트랜잭션으로 결합하여 메시지가 순서대로 전달되고 정확히 한 번 전달되며 대상 대기열에서 성공적으로 검색될 수 있도록 합니다. 오류가 발생하면 전체 거래가 취소됩니다.
보안 — MessageQueue 구성 요소의 기반이 되는 메시지 큐 기술은 Windows 보안을 사용하여 액세스 제어를 보호하고 감사를 제공하며 구성 요소에서 보내고 받는 메시지를 암호화 및 인증합니다.
5. .Net 환경에서 간단한 Message Queue 프로그램 작성
(1) 먼저 제어판을 통해 메시지 큐 서비스
를 설치하고 " 추가 /프로그램 제거” – “Windows 구성 요소 추가/제거” 단계에서는 MSMQ를 설치합니다.
MSMQ는 작업 그룹 모드 또는 도메인 모드로 설치할 수 있습니다. 설치 관리자가 디렉터리 서비스를 제공하는 메시지 큐를 실행하는 서버를 찾지 못하면 작업 그룹 모드에서만 설치할 수 있습니다. 이 컴퓨터의 메시지 큐는 개인 큐 만들기와 메시지 큐를 직접 실행하는 다른 컴퓨터와의 공유 큐 만들기만 지원합니다. 연결.
(2) MSMQ 구성
컴퓨터 관리 열기 – 메시지 대기열 및 개인 대기열 아래에 MSMQDemo 대기열 생성
( 3) 코드 작성 - 간단한 데모 MSMQ 개체
MessageQueue 클래스는 "Message Queue"를 둘러싼 래퍼입니다. MessageQueue 클래스는 메시지 큐 대기열에 대한 참조를 제공합니다. MessageQueue 생성자에서 기존 리소스에 대한 경로를 지정하거나 서버에 새 큐를 만들 수 있습니다. Send, Peek 또는 receive를 호출하기 전에 MessageQueue 클래스의 새 인스턴스를 기존 큐와 연결해야 합니다.
MessageQueue는 동기식과 비동기식이라는 두 가지 유형의 메시지 검색을 지원합니다. 동기 Peek 및 수신 메서드를 사용하면 프로세스 스레드가 새 메시지가 큐에 도착할 때까지 지정된 간격 동안 기다리게 됩니다. 비동기식 BeginPeek 및 BeginReceive 메서드를 사용하면 메시지가 큐에 도착하기 전에 기본 애플리케이션 작업이 별도의 스레드에서 계속 실행될 수 있습니다. 이러한 메서드는 콜백 객체와 상태 객체를 사용하여 스레드 간에 정보를 전달하는 방식으로 작동합니다.
// 메시지 보내기
private void btnSendMessage_Click(object sender, System.EventArgs e)
{
// 대기열 열기
System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".\Private$\MSMQDemo");
// 메시지 생성
System.Messaging .Message message = new System.Messaging.Message();
message.Body = txtMessage.Text.Trim();
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});
// 대기열에 메시지 넣기
queue.Send(message);
}
// 메시지 수신
private void btnReceiveMessage_Click(object sender, System.EventArgs e)
{
// 대기열 열기
System.Messaging.MessageQueue 큐 = new System.Messaging.MessageQueue(".\Private$\MSMQDemo");
// 메시지 수신, 같은 수신 방법阻塞当前执行线程,直到一个message可以得到
System.Messaging.Message message = queue.Receive();
message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});
txtReceiveMessage.Text = message.Body.ToString();
}