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;
}
首先(有点无关)我建议将客户端与发送消息分离:
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;
}
像Throttling
或ServiceUnavailable
这样的异常通常被忽略,但可以正确处理。对于这样的事情,通常建议您实现指数后退。当你被限制时,你会后退,直到服务再次可用。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源代码。