繁体   English   中英

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

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

  1. 创建一个死信队列
  2. 通过选中“使用Redrive策略”为源队列启用Redrive策略
  3. 选择您在步骤#1中为“死信队列”创建的死信队列
  4. 将“Maximum Receives”设置为“3”或1到1000之间的任何值

工作原理是,只要工作人员收到消息,接收计数就会递增。 一旦达到“最大接收”计数,消息就会被推送到死信队列。 请注意,即使您通过aws控制台访问消息,接收计数也会递增。

使用Amazon SQS死信队列的来源

它应该在几个步骤中完成。

  1. 创建SQS连接: - sqsconnrec = SQSConnection(AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY)
  2. create queue object: - request_q = sqsconnrec.create_queue(“queue_Name”)
  3. 加载队列消息: - messages = request_q.get_messages()
  4. 现在你得到消息对象的数组并找到消息的总数: - 只做len(消息)

应该像魅力一样工作。

从您阅读的邮件中获取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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM