我正在尝试运行一个进程,该进程每隔n秒将一系列消息发送到SQS FIFO队列,以获取我们手头上的一组设备:
while 1:
for i in range(0, len(device_list)):
print("Putting message on queue for {}".format(device_list[i]))
resp = sqs.send_message(
QueueUrl=url,
MessageAttributes={
'device': {'DataType': 'String', 'StringValue': device_list[i]},
'start': {'DataType': 'Number', 'StringValue': stime},
'end': {'DataType': 'Number', 'StringValue': etime}
},
MessageBody=(
'SQS message test'
),
MessageGroupId=id
)
sleep(n)
当前仅使用20台设备进行测试。我遇到的问题是FIFO队列仅接收到我发送的第一条消息(直接检查SQS控制台,MessagesAvailable属性为1)。我对标准队列没有相同的问题(MessagesAvailable属性表示20),但是排序很重要,因此FIFO队列是我要达到的目的。
我是SQS的新手,因此不确定我的队列配置是否存在问题(使用默认设置),它只是SQS FIFO队列的功能还是我是否正确使用了boto库。我有什么想念的东西吗?
答案 0 :(得分:1)
我没有使用该库的经验,但是阅读文档here会使我相信可能的问题可能是缺少提供MessageDeduplicationId
。特别是以下文本:
- 您可以显式提供MessageDeduplicationId。
- 如果您无法提供MessageDeduplicationId并为队列启用ContentBasedDeduplication,则Amazon SQS使用SHA-256
哈希以使用
的主体生成MessageDeduplicationId 消息(但不是消息的属性)。
没有看到其余的代码,我无法判断ContentBasedDeduplication
是否处于活动状态。如果是这样,由于它散列在已发送邮件的正文上,并且您的邮件正文永不更改,因此您可能会不断覆盖队列中的上一封邮件。