AWS SQS错误处理

本文关键字:处理 错误 SQS AWS | 更新日期: 2023-09-27 18:28:35

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

我正在运行Amazon.NETSDK,每天发送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;
}

AWS SQS错误处理

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

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

最后回答您的问题:检查Common Errors和SendMessage(在您的情况下)页面并捕获相关的异常。你做什么取决于你的应用程序以及它应该如何处理丢失的消息。例如:

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这样的异常通常被忽略,但可以正确处理。对于这样的事情,通常建议您实现指数后退。当你被限制时,你会后退,直到服务再次可用。Java中的实现和使用示例:https://gist.github.com/alph486/f123ea139e6ea56e696f。

您根本不需要做太多自己的错误处理;用于.NET的AWS SDK在后台处理瞬时故障的重试。

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

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

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

当达到配置的最大重试次数时,SDK将抛出。您可以这样配置最大重试次数:

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

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

来源:GitHub上的AWS SDK.NET源代码。