我不是亚马逊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)
有人可以解释为什么我突然收到重复的邮件吗?我没有权限查看队列的大小,我如何获取其中的所有消息?我做得对吗?
答案 0 :(得分:2)
在处理来自队列的消息后,您需要发回消息已被处理的通知,并且应该将其删除。如果不这样做,则只是意味着消息位于队列中并被重新获取,直到达到获取限制并被发送到死信队列或它到期为止。
SQS不保证唯一性并且您可以获得重复项,您可以设置Visibility Timeout以防止在检索到该消息后的一段时间内将其读取,例如大约一分钟,让您有时间处理消息并将其从队列中删除。这应该避免重复。
至于删除消息迭代消息,处理它们然后运行...
conn.delete_message(q, message)
或
q.delete_message(message)