如何使用Python中的boto库在Amazon SQS中获取消息?

时间:2012-08-10 12:03:09

标签: python boto amazon-sqs

我在Python中使用boto库来获取Amazon SQS消息。在特殊情况下,我不会从队列中删除消息,以便进行一些更改以恢复临时故障。但我不想不断收到失败的消息。我想做的是收到超过3次后删除邮件,或者如果收到次数超过3则不收到邮件。

最优雅的做法是什么?

5 个答案:

答案 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已经内置了对此的支持,只需按照以下步骤操作:

  1. 创建一个死信队列
  2. 通过选中“使用Redrive策略”
  3. 为源队列启用Redrive策略
  4. 选择您在步骤#1中为“死信队列”
  5. 创建的死信队列
  6. 将“Maximum Receives”设置为“3”或1到1000之间的任何值
  7. 工作原理是,只要工作人员收到消息,接收计数就会递增。一旦达到“最大接收”计数,消息就会被推送到死信队列。请注意,即使您通过aws控制台访问消息,接收计数也会增加。

    来源Using Amazon SQS Dead Letter Queues

答案 3 :(得分:1)

应该只需几步即可完成。

  1. 创建SQS连接: - sqsconnrec = SQSConnection(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
  2. 创建队列对象: - request_q = sqsconnrec.create_queue(“queue_Name”)
  3. 加载队列消息: - messages = request_q.get_messages()
  4. 现在您获取了消息对象数组并查找消息总数: - 只做len(消息)
  5. 应该像魅力一样。

答案 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);
            }
        }