AWS SQS错误处理

时间:2014-10-30 09:51:43

标签: c# .net amazon-web-services amazon-sqs

因为一切都失败了一天或另一天。在向Amazon SQS发布消息时,是否有任何关于如何处理错误的建议/最佳实践?

我正在运行Amazon .NET SDK并每天发送几条1000条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;
}

2 个答案:

答案 0 :(得分:2)

首先(有点无关)我建议将客户端与发送消息分开:

public class QueueStuff{
private static IAmazonSQS SQS; 

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

最后回答您的问题:检查Common ErrorsSendMessage(在您的情况下)页面并捕获相关的例外情况。你做的将取决于你的应用程序以及它应该如何处理丢失的消息。一个例子可能是:

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;
}

ThrottlingServiceUnavailable等例外情况常被忽视但可以正确处理。它的commonly recommended对于像这样的东西,你实现了指数退避。当你扼杀你后退,直到服务再次可用。 Java中的实现和使用示例:https://gist.github.com/alph486/f123ea139e6ea56e696f

答案 1 :(得分:1)

你根本不需要做很多自己的错误处理; AWS SDK for .NET处理引擎下的瞬态故障重试。

如果出现以下情况,它将自动重试任何失败的请求:

  • 您对AWS服务的访问受到限制
  • 请求超时
  • HTTP连接失败

它使用指数退避策略进行多次重试。在第一次失败时,它会休眠400毫秒,然后再次尝试。如果该尝试失败,则在再次尝试之前休眠1600毫秒。如果失败,则会休眠6400毫秒,依此类推,最长可达30秒。

当达到配置的最大重试次数时,SDK将抛出。您可以配置最大重试次数,如下所示:

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

如果API调用最终抛出,则意味着某些内容确实错误,例如SQS已在您所在的区域中出现故障,或者您的请求无效。

来源:The AWS SDK for .NET Source Code on GitHub