我在Python中使用boto库来获取Amazon SQS消息。在特殊情况下,我不会从队列中删除消息,以便进行一些更改以恢复临时故障。但我不想不断收到失败的消息。我想做的是收到超过3次后删除邮件,或者如果收到次数超过3则不收到邮件。
最优雅的做法是什么?
答案 0 :(得分:4)
其他方式可能是您可以在SQS队列中的消息末尾添加额外的标识符。该标识符可以保持消息被读取的次数。
此外,如果您希望您的服务不要一次又一次地轮询这些消息,那么您可以创建另一个队列,例如“Dead Message Queue”,然后可以将超过阈值的消息传输到此队列。
答案 1 :(得分:3)
至少有几种方法可以做到这一点。
当您在boto中阅读邮件时,您会收到一个Message对象或其子类。 Message对象具有"属性"字段,它是包含SQS已知的所有消息属性的字典。 SQS跟踪的事情之一是消息被读取的近似次数。因此,您可以使用此值来确定是否应删除邮件,但您必须熟悉"近似"价值的本质。
或者,您可以在某种数据库中记录消息ID,并在每次阅读消息时增加数据库中的计数字段。这可以在一个简单的Python dict中完成,如果消息总是在单个进程中读取,或者如果需要跨进程记录读数,则可以在SimpleDB中完成。
希望有所帮助。
以下是一些示例代码:
>>> import boto.sqs
>>> c = boto.sqs.connect_to_region()
>>> q = c.lookup('myqueue')
>>> messages = c.receive_message(q, num_messages=1, attributes='All')
>>> messages[0].attributes
{u'ApproximateFirstReceiveTimestamp': u'1365474374620',
u'ApproximateReceiveCount': u'2',
u'SenderId': u'419278470775',
u'SentTimestamp': u'1365474360357'}
>>>
答案 2 :(得分:2)
aws已经内置了对此的支持,只需按照以下步骤操作:
工作原理是,只要工作人员收到消息,接收计数就会递增。一旦达到“最大接收”计数,消息就会被推送到死信队列。请注意,即使您通过aws控制台访问消息,接收计数也会增加。
答案 3 :(得分:1)
应该只需几步即可完成。
应该像魅力一样。
答案 4 :(得分:1)
从您阅读的邮件中获取ApproximateReceiveCount属性。 将它移动到另一个队列(比您可以管理错误消息)或只是删除它。
foreach (var message in response.Messages){
try{
var notifyMessage = JsonConvert.DeserializeObject<NotificationMessage>(message.Body);
Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle);
}
catch (Exception ex){
var receiveMessageCount = int.Parse(message.Attributes["ApproximateReceiveCount"]);
if (receiveMessageCount >3 )
Global.Sqs.DeleteMessageFromQ(message.ReceiptHandle);
}
}