因为一切都失败了一天或另一天。在向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;
}
答案 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 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
等例外情况常被忽视但可以正确处理。它的commonly recommended对于像这样的东西,你实现了指数退避。当你扼杀你后退,直到服务再次可用。 Java中的实现和使用示例:https://gist.github.com/alph486/f123ea139e6ea56e696f。
答案 1 :(得分:1)
你根本不需要做很多自己的错误处理; AWS SDK for .NET处理引擎下的瞬态故障重试。
如果出现以下情况,它将自动重试任何失败的请求:
它使用指数退避策略进行多次重试。在第一次失败时,它会休眠400毫秒,然后再次尝试。如果该尝试失败,则在再次尝试之前休眠1600毫秒。如果失败,则会休眠6400毫秒,依此类推,最长可达30秒。
当达到配置的最大重试次数时,SDK将抛出。您可以配置最大重试次数,如下所示:
var sqsClient = AWSClientFactory.CreateAmazonSQSClient(
new AmazonSQSConfig
{
MaxErrorRetry = 4 // the default is 4.
});
如果API调用最终抛出,则意味着某些内容确实错误,例如SQS已在您所在的区域中出现故障,或者您的请求无效。