SQS FIFO队列仅使用BOTO send_message接收一条消息

时间:2018-07-23 20:13:40

标签: python boto amazon-sqs

我正在尝试运行一个进程,该进程每隔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库。我有什么想念的东西吗?

1 个答案:

答案 0 :(得分:1)

我没有使用该库的经验,但是阅读文档here会使我相信可能的问题可能是缺少提供MessageDeduplicationId。特别是以下文本:

  
      
  • 您可以显式提供MessageDeduplicationId。
  •   
  • 如果您无法提供MessageDeduplicationId并为队列启用ContentBasedDeduplication,则Amazon SQS使用SHA-256
      哈希以使用
    的主体生成MessageDeduplicationId   消息(但不是消息的属性)。
  •   

没有看到其余的代码,我无法判断ContentBasedDeduplication是否处于活动状态。如果是这样,由于它散列在已发送邮件的正文上,并且您的邮件正文永不更改,因此您可能会不断覆盖队列中的上一封邮件。