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

SQS FIFO Queue Only Receiving One Message Using BOTO send_message

我正在尝试 运行 一个进程,该进程每 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 库正确。有没有我遗漏或做错了什么?

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

  • You may provide a MessageDeduplicationId explicitly.
  • If you aren't able to provide a MessageDeduplicationId and you enable ContentBasedDeduplication for your queue, Amazon SQS uses a SHA-256
    hash to generate the MessageDeduplicationId using the body of the
    message (but not the attributes of the message).

如果没有看到您的其余代码,我无法判断 ContentBasedDeduplication 是否处于活动状态。如果是,因为它对发送的消息正文进行哈希处理,而您的消息正文永远不会更改,您可能会不断覆盖队列中的前一条消息。