Amazon SQS重复队列中的消息

时间:2016-02-02 22:43:35

标签: python amazon-s3 boto

我不是亚马逊SQS服务中使用的经验。我必须从我不拥有的队列中读取消息,并处理它们,创建一个包含一些信息的小型数据库。

到目前为止,我只有一些代码可以读取队列中的所有消息并处理它们。该脚本定期运行。

然而,最近我发现队列中的消息量突然变得非常大。当我拍摄10000个样本消息时,我发现大约有6000个重复的消息。

我对这种突然的行为改变感到困惑(到目前为止,我没有观察到重复的消息)。队列似乎永远不会用完。

这是我用来读取队列中所有消息的代码。

conn = boto.sqs.connect_to_region(
    'myregions',
    aws_access_key_id='myacceskey',
    aws_secret_access_key='secretAccesKey')
q = boto.sqs.queue.Queue(connection=conn, url='outputQueue')

rs = q.get_messages(10)
all_messages = []
while len(rs) > 0:
    all_messages.extend(rs)
    print (len(all_messages))
    rs = q.get_messages(10)

有人可以解释为什么我突然收到重复的邮件吗?我没有权限查看队列的大小,我如何获取其中的所有消息?我做得对吗?

1 个答案:

答案 0 :(得分:2)

在处理来自队列的消息后,您需要发回消息已被处理的通知,并且应该将其删除。如果不这样做,则只是意味着消息位于队列中并被重新获取,直到达到获取限制并被发送到死信队列或它到期为止。

SQS不保证唯一性并且您可以获得重复项,您可以设置Visibility Timeout以防止在检索到该消息后的一段时间内将其读取,例如大约一分钟,让您有时间处理消息并将其从队列中删除。这应该避免重复。

至于删除消息迭代消息,处理它们然后运行...

conn.delete_message(q, message)

q.delete_message(message)