내보내기(0) 인쇄
모두 확장

메시징 개체 수명 주기 관리

업데이트 날짜: 2014년 3월

TopicClient, QueueClientSubscriptionClient 같은 메시징 개체는 일단 만들면 가능한 한 다시 사용됩니다. 이러한 개체는 여러 스레드에서 동시에 메시지를 주고받을 수 있도록 스레드 보안을 준수합니다. 메시징 개체를 만들 때 Microsoft Azure Active Directory 액세스 제어(액세스 제어 서비스 또는 ACS라고도 함)에서 클라이언트 요청을 인증하는 것과 관련된 약간의 오버헤드가 있으므로 TopicClient, QueueClientSubscriptionClient 개체 인스턴스를 캐싱하는 것이 좋습니다. 최적의 리소스 사용을 위해 해당 Service Bus 메시징 개체를 사용하는 메시징 구성 요소의 수명으로 캐시 범위를 제한하는 것이 좋습니다.

메시징 개체 수명 주기

MessagingFactory 개체에서 새 인스턴스를 검색하면 메시징 개체의 수명이 시작됩니다.

// The following actions are often performed upon initialization of an application-level messaging component.

string issuerName = "Issuer Name is retrieved from configuration file";
string issuerSecret = "Issuer Secret also comes from configuration file";
string serviceNamespace = "contoso-cloud";
string queuePath = "PurchaseOrders";

var credentials = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret);
var address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, String.Empty);
var messagingFactory = MessagingFactory.Create(address, credentials);
var queueClient = messagingFactory.CreateQueueClient(queuePath, ReceiveMode.ReceiveAndDelete);

앞서 설명했듯이 단일 QueueClient 개체는 지정된 큐를 대상으로 메시지를 주고받는 데 다시 사용할 수 있습니다. 주고받는 모든 메시지에 대해 새로운 QueueClient 개체 인스턴스를 만들지 않아도 됩니다.

for (int i = 0; i < 5; i++)
{
    using (var msg = new BrokeredMessage(String.Format("Message #{0}", i)))
    {
        queueClient.Send(msg);
    }
}

메시징 개체는 Azure 플랫폼에서 호스팅되는 Service Bus 메시징 인프라에 대한 활성 연결을 그대로 유지합니다. 다른 많은 유형의 다중 테넌트 서비스와 마찬가지로 Service Bus에서 제공되는 조정된 메시징 서비스는 큐, 항목 또는 구독과 같은 단일 메시징 엔터티에서 지원할 수 있는 활성 동시 연결 수와 관련하여 할당량이 적용됩니다. 나중에 Service Bus 메시징 개체를 다시 사용할 계획이 없는 경우 동시 연결 수를 최소화하려면 이 메시징 개체의 수명을 명시적으로 제어하고 이를 닫는 것이 좋습니다. 또한 메시징 솔루션이 정상적으로 종료되면 메시징 팩터리 개체를 닫아야 합니다.

note참고
여러 메시징 개체가 팩터리 수준에서 연결을 공유하므로 메시징 개체를 닫아도 기본 연결은 닫히지 않습니다. 다시 말해 메시징 팩터리 개체를 닫으면 Service Bus 메시징 인프라에 대한 기본 연결이 닫힙니다.

지정된 메시징 개체를 닫으려면 다음 기술 중 하나를 사용하여 해당 Close() 메서드를 호출해야 합니다.

// When a queue client is no longer required, let's close it so that it doesn't consume a connection.

// Option #1: Closing a specific messaging object instance.
queueClient.Close();

// Option #2: Closing all messaging objects tracked by the messaging factory.
messagingFactory.Close();

일부 드문 경우에서 메시징 개체가 정상적으로 닫히지 않는 상태로 종료될 수도 있습니다. 이러한 상황이 발생하면 조정된 메시징 API는 개체를 닫을 수 없는 경우 연결을 중단하는 등 적절한 작업이 수행되도록 합니다. Abort() 또는 Close() 메서드를 호출할지 여부를 확인하기 위해 사용자가 상태 검사를 수행하지 않아도 됩니다. 이는 API에서 내부적으로 수행됩니다. Close() 메서드는 완료 시 예외를 throw할 수도 있습니다. 따라서 메시징 개체를 항상 안전하게 닫으려면 try/catch 구문 형식의 보호 계층을 추가하는 것이 좋습니다.

note참고
메시징 개체를 닫는 것이 삭제 작업과 다르기는 하지만 닫힌 인스턴스를 나중에 다시 사용하려는 경우 닫힌 개체를 다시 열 수 없습니다. 닫힌 메시징 개체에 대한 작업을 호출하려고 하면 "이 메시징 엔터티는 이미 닫혔거나, 중단되었거나 삭제되었습니다." 같은 설명의 예외를 받을 수 있습니다. 메시징 개체를 열린 상태로 복원하기 위해 클라이언트에서 호출할 수 있는 공용 Open() 메서드는 없으므로 새로운 인스턴스의 메시징 개체를 만들어야 합니다. 이 권장 사항은 MessagingFactory 개체에도 적용됩니다.

Close() 메서드를 호출하면 메시징 개체의 수명이 종료됩니다. 솔루션에서 사용되는 모든 메시징 개체가 정상적으로 종료되도록 하는 가장 쉬운 방법은 큐, 항목 및 구독에 대한 메시징 클라이언트를 만드는 데 사용되는 MessagingFactory 개체를 명시적으로 닫는 것입니다. MessagingFactory를 명시적으로 닫으면 이 클래스에서 만들고 소유하는 모든 메시징 개체가 암시적으로 닫힙니다. 메시징 구성 요소의 Dispose() 메서드 내에서, OnStop()에서 제공되는 RoleEntryPoint 메서드 내에서 또는 UnhandledException 이벤트 처리기 내에서 팩터리 개체를 닫으려는 경우를 예로 들 수 있습니다.

커뮤니티 추가 항목

추가
표시:
© 2014 Microsoft