[英]How to get all messages in Amazon SQS queue using boto library in Python?
[英]How to get messages receive count in Amazon SQS using boto library in Python?
我在Python中使用boto库来获取Amazon SQS消息。 在特殊情况下,我不会从队列中删除消息,以便进行一些更改以恢复临时故障。 但我不想不断收到失败的消息。 我想要做的是在收到超过3次后删除邮件,或者如果收到次数超过3则不获取邮件。
这样做最优雅的方式是什么?
至少有几种方法可以做到这一点。
当您在boto中读取消息时,您会收到Message对象或其子类。 Message对象有一个“attributes”字段,它是一个包含SQS已知的所有消息属性的dict。 SQS跟踪的事情之一是消息被读取的近似次数。 因此,您可以使用此值来确定是否应删除邮件,但您必须熟悉该值的“近似”性质。
或者,您可以在某种数据库中记录消息ID,并在每次读取消息时增加数据库中的计数字段。 如果消息总是在单个进程中读取,或者如果需要跨进程记录读数,则可以在SimpleDB中完成,这可以在简单的Python dict中完成。
希望有所帮助。
这是一些示例代码:
>>> 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'}
>>>
其他方式可能是您可以在SQS队列中的消息末尾添加额外的标识符。 该标识符可以保持消息被读取的次数。
此外,如果您希望您的服务不应一次又一次地轮询这些消息,那么您可以创建另一个队列,例如“Dead Message Queue”,然后可以将超过阈值的消息传输到此队列。
aws内置了对此的支持,只需按照以下步骤操作:
工作原理是,只要工作人员收到消息,接收计数就会递增。 一旦达到“最大接收”计数,消息就会被推送到死信队列。 请注意,即使您通过aws控制台访问消息,接收计数也会递增。
它应该在几个步骤中完成。
应该像魅力一样工作。
从您阅读的邮件中获取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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.