영업: 1-800-867-1380

일시적인 통신 오류를 처리

업데이트 날짜: 2014년 3월

Microsoft Azure 서비스 버스 .NET 관리되는 브로커 메시징 API를 사용하는 솔루션의 안정성을 향상하려면 솔루션이 Service Bus에서 제공하는 대규모의 다중 테넌트 클라우드 기반 큐 및 게시/구독 메시지 서비스 인프라와 통신할 때 나타날 수 있는 일시적인 장애와 간헐적 오류를 처리하기 위한 일관된 접근 방식을 사용하는 것이 좋습니다.

Service Bus .NET 관리되는 브로커 메시징 API를 사용하는 솔루션의 안정성을 향상하려면 솔루션이 Service Bus에서 제공하는 대규모의 다중 테넌트 클라우드 기반 큐 및 게시/구독 메시지 서비스 인프라와 통신할 때 나타날 수 있는 일시적인 장애와 간헐적 오류를 처리하기 위한 일관된 접근 방식을 사용하는 것이 좋습니다.

일시적인 상태를 감지하기 위한 특정 기술을 고려할 때 일시적인 오류 처리 프레임워크와 같은 기존의 기술 솔루션을 활용하거나 직접 개발할 수 있습니다. 어떤 경우에도 해당 오류의 복구를 시도하기 전에 부분적인 통신 예외만을 먼저 처리하도록 해야 합니다.

다음 표에는 다시 시도 논리는 구현하여 보정할 수 있는 예외의 목록이 나와 있습니다.

 

예외 유형

권장 사항

ServerBusyException

이 예외는 Service Bus 메시징 서비스 인프라에서 지정 시간 비정상 부하 상태로 인해 요청을 처리할 수 없는 일시적 오류로 인해 발생할 수 있습니다. 클라이언트는 일정한 간격으로 다시 시도할 수 있습니다. 서버에 필요 없는 부담을 주지 않도록 하기 위해 백오프 지연을 사용하는 것이 좋습니다.

MessagingCommunicationException

이 예외는 메시징 클라이언트에서 Service Bus 인프라로 연결을 설정할 수 없을 때 발생할 수 있는 통신 오류를 나타냅니다. 대부분의 경우 네트워크 연결이 설정될 경우 이 오류를 일시적인 오류로 처리할 수 있습니다. 클라이언트는 이 유형의 예외를 발생시킨 작업을 다시 시도할 수 있습니다. 또한 이 오류는 대상 호스트 이름을 확인할 수 없음을 나타낼 수 있으므로 도메인 이름 확인 서비스(DNS)가 작동하는지 확인하는 것이 좋습니다.

TimeoutException

이 예외는 OperationTimeout 설정으로 지정한 시간 안에 Service Bus 메시징 서비스 인프라가 요청 작업에 응답하지 않았음을 나타냅니다. 요청 작업은 완료될 수 있지만 네트워크나 기타 인프라 지연으로 인해 제시간 안에 클라이언트에 응답이 전달되지 않을 수 있습니다. 이 유형의 예외는 신중하게 보정해야 합니다. 메시지가 큐에 전달되었지만 응답이 시간 초과된 경우 원래 메시지를 다시 보내면 중복이 발생합니다.

Service Bus 메시징 API에서 보고할 수 있는 다양한 유형의 예외에 대한 자세한 내용을 보려면 메시징 예외 항목을 참조하십시오.

note참고
일시적 통신 오류를 처리할 때는 다양한 유형의 일시적 예외가 외부 예외로 인해 일시적 예외가 가려질 수 있다는 것을 주의하십시오. 예를 들어 시간 초과는 원래 시간 초과를 내부 예외로 숨기는 통신 오류 형태로 호출자에게 반환될 수 있습니다. 따라서 일시적 통신 오류를 확실히 검출할 수 있도록 하기 위해 특정 예외 개체의 모든 내부 예외를 재귀적 방식으로 검사하는 것이 좋습니다. 이렇게 하는 방법의 예를 Transient Fault Handling FrameworkServiceBusTransientErrorDetectionStrategy 클래스에서 제공합니다.

다음 코드 조각은 확인된 모든 일시적 오류를 재시도를 통해 보정하는 동시에 Service Bus 항목으로 메시지를 비동기적으로 보내는 방법을 보여 줍니다. 이 코드 샘플은 일시적 오류 처리프레임워크의 종속성을 유지합니다.

var credentials = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret);
var address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, String.Empty);
var messagingFactory = MessagingFactory.Create(address, credentials);
var topicClient = messagingFactory.CreateTopicClient(topicPath);
var retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(RetryPolicy.DefaultClientRetryCount);

// Create an instance of the object that represents message payload.
var payload = XDocument.Load("InventoryFile.xml");

// Declare a BrokeredMessage instance outside so that it can be reused across all 3 delegates below.
BrokeredMessage msg = null;

// Use a retry policy to execute the Send action in an asynchronous and reliable fashion.
retryPolicy.ExecuteAction
(
    (cb) =>
    {
        // A new BrokeredMessage instance must be created each time we send it. Reusing the original BrokeredMessage instance may not 
        // work as the state of its BodyStream cannot be guaranteed to be readable from the beginning.
        msg = new BrokeredMessage(payload.Root, new DataContractSerializer(typeof(XElement)));

        // Send the event asynchronously.
        topicClient.BeginSend(msg, cb, null);
    },
    (ar) =>
    {
        try
        {
            // Complete the asynchronous operation. 
            // This may throw an exception that will be handled internally by the retry policy.
            topicClient.EndSend(ar);
        }
        finally
        {
            // Ensure that any resources allocated by a BrokeredMessage instance are released.
            if (msg != null)
            {
                msg.Dispose();
                msg = null;
            }
        }
    },
    (ex) =>
    {
        // Always dispose the BrokeredMessage instance even if the send 
        // operation has completed unsuccessfully.
        if (msg != null)
        {
            msg.Dispose();
            msg = null;
        }

        // Always log exceptions.
        Trace.TraceError(ex.Message);
    }
);

다음 코드 샘플은 Service Bus 항목을 안정적으로 만들거나 기존 항목을 검색하는 방법을 보여 줍니다. 또한 이 코드는 일시적 연결 문제나 다른 일시적 상태로 인해 관리 작업을 성공적으로 완료할 수 없을 경우 해당 관리 작업을 자동으로 다시 시도하는 Transient Fault Handling Framework의 종속성을 유지합니다.

public TopicDescription GetOrCreateTopic(string issuerName, string issuerSecret, string serviceNamespace, string topicName)
{
    // Must validate all input parameters here. Use Code Contracts or build your own validation.
    var credentials = TokenProvider.CreateSharedSecretTokenProvider(issuerName, issuerSecret);
    var address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, String.Empty);
    var nsManager = new NamespaceManager(address, credentials);
    var retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(RetryPolicy.DefaultClientRetryCount);

    TopicDescription topic = null;
    bool createNew = false;

    try
    {
        // First, let's see if a topic with the specified name already exists.
        topic = retryPolicy.ExecuteAction<TopicDescription>(() => { return nsManager.GetTopic(topicName); });

        createNew = (topic == null);
    }
    catch (MessagingEntityNotFoundException)
    {
        // Looks like the topic does not exist. We should create a new one.
        createNew = true;
    }

    // If a topic with the specified name doesn't exist, it will be auto-created.
    if (createNew)
    {
        try
        {
            var newTopic = new TopicDescription(topicName);

            topic = retryPolicy.ExecuteAction<TopicDescription>(() => { return nsManager.CreateTopic(newTopic); });
        }
        catch (MessagingEntityAlreadyExistsException)
        {
            // A topic under the same name was already created by someone else, 
            // perhaps by another instance. Let's just use it.
            topic = retryPolicy.ExecuteAction<TopicDescription>(() => { return nsManager.GetTopic(topicName); });
        }
    }

    return topic;
}

간단히 말해서 오류 발생 가능성을 평가한 후 추가적인 탄력성 강화를 실현할 수 있는지 결정하는 것이 좋습니다. 실제로 모든 메시징 작업은 일시적 상태의 영향을 받을 수 있습니다. 브로커 메시징 API를 호출할 경우 따라서 일시적 문제 복구를 항상 제공하는 적절한 조치를 취하는 것이 좋습니다.

이 정보가 도움이 되었습니까?
(1500자 남음)
의견을 주셔서 감사합니다.
Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2014 Microsoft