2014-10-30 4 views
0

모든 것이 하루 동안 실패합니다. Amazon SQS에 메시지를 게시 할 때 오류를 처리하는 방법에 대한 권장 사항/모범 사례가 있습니까?AWS SQS 오류 처리

아마존 .NET SDK를 실행 중이고 하루에 몇 개의 SQS 메시지를 전송합니다. 게시가 실패했다는 사실에 관심을 갖지는 못했지만 문제가 발생하면 문제가 될 수 있습니다. 그러나

, 나는 기본 코드를 다음 (SDK 설명서에서 거의 직선 앞으로 사용 예)에서 오류를 처리하는 방법 :

public static string sendSqs(string data) 
{ 
    IAmazonSQS sqs = AWSClientFactory.CreateAmazonSQSClient(RegionEndpoint.EUWest1); 
    SendMessageRequest sendMessageRequest = new SendMessageRequest(); 
    CreateQueueRequest sqsRequest = new CreateQueueRequest(); 
    sqsRequest.QueueName = "mySqsQueue"; 
    CreateQueueResponse createQueueResponse = sqs.CreateQueue(sqsRequest); 
    sendMessageRequest.QueueUrl = createQueueResponse.QueueUrl; 
    sendMessageRequest.MessageBody = data; 
    SendMessageResponse sendMessageresponse = sqs.SendMessage(sendMessageRequest); 
    return sendMessageresponse.MessageId; 
} 

답변

1

오류 처리를 많이 할 필요는 없습니다. AWS SDK for .NET은 후드의 일시적인 실패에 대한 재시도를 처리합니다.

는 AWS 서비스에 대한 액세스가
  • 에서
  • 요청 시간을 스로틀되고
    • HTTP 연결이

    그것은 실패 :

    자동으로 경우 실패 어떤 요청을 다시 시도합니다 여러 번의 재 시도를 위해 지수 적 백 오프 전략을 사용합니다. 첫 번째 실패시 400ms 동안 잠자기 후 다시 시도합니다. 시도가 실패하면 다시 시도하기 전에 1600ms 동안 잠자기 상태가됩니다. 실패하면 6400ms 동안 잠자기되는 등 최대 30 초까지 지속됩니다.

    구성된 최대 재시도 횟수에 도달하면 SDK가 작동을 중지합니다. 이 같은 시도의 최대 수 구성 할 수 있습니다 API 호출이 던지는를 종료하는 경우

    var sqsClient = AWSClientFactory.CreateAmazonSQSClient( 
          new AmazonSQSConfig 
          { 
           MaxErrorRetry = 4 // the default is 4. 
          }); 
    

    를, 그것은 SQS는 해당 지역에 추락했습니다처럼 뭔가, 정말 잘못, 또는 귀하의 요청이 유효하다는 것을 의미 .

    출처 : The AWS SDK for .NET Source Code on GitHub.

  • +0

    EC2 또는 EC2가 아닌 NAT 또는 프록시 서버를 통해 SQS에 전화를 걸면 SQS가 여전히 사용 가능하더라도 인터넷 연결이 끊어 질 수 있습니다. 이러한 유형의 문제가 처음부터 대기열을 사용하는 주된 이유이기 때문에 처리하기가 매우 어려울 수 있습니다. – JaredHatfield

    1

    먼저 (좀 관련이없는) 전에서 클라이언트를 분리하는 것이 좋습니다 메시지 보내기 :

    public class QueueStuff{ 
    private static IAmazonSQS SQS; 
    
    //Get only one of these 
    public QueueStuff(){ 
        SQS = AWSClientFactory.CreateAmazonSQSClient(RegionEndpoint.EUWest1); 
    } 
    //...use SQS elsewhere... 
    

    마지막으로 귀하의 질문에 대답 할 수는 다음 Common ErrorsSendMessage (귀하의 경우) 페이지를 확인하고 관련 예외를 잡을 수있어. 당신이하는 일은 앱과 메시지 손실을 처리하는 방법에 달려 있습니다. 예는 다음과 같을 수 있습니다 Throttling 또는 ServiceUnavailable 같은

    public static string sendSqs(string data) 
    { 
        SendMessageRequest sendMessageRequest = new SendMessageRequest(); 
        CreateQueueRequest sqsRequest = new CreateQueueRequest(); 
        sqsRequest.QueueName = "mySqsQueue"; 
        CreateQueueResponse createQueueResponse = sqs.CreateQueue(sqsRequest); 
        sendMessageRequest.QueueUrl = createQueueResponse.QueueUrl; 
        sendMessageRequest.MessageBody = data; 
        try{ 
         SendMessageResponse sendMessageresponse = SQS.SendMessage(sendMessageRequest); 
        catch(InvalidMessageContents ex){ //Catch or bubble the exception up. 
        //I can't do anything about this so toss the message... 
        LOGGER.log("Invalid data in request: "+data, ex); 
        return null; 
        } catch(Throttling ex){ //I can do something about this! 
        //Exponential backoff... 
        } 
        return sendMessageresponse.MessageId; 
    } 
    

    예외가 흔히 간과 사람이지만 제대로 처리 할 수 ​​있습니다. 그것의 commonly recommended 이러한 것들을 위해 당신은 지수 백 오프를 구현합니다. 서비스를 다시 사용할 수있을 때까지 당신을 늦추십시오. Java 구현 및 사용 예 : https://gist.github.com/alph486/f123ea139e6ea56e696f.

    관련 문제