【问题标题】:AWS SQS ReceiveMessage receiving less / fewer messages than requested?AWS SQS ReceiveMessage 接收的消息少于/少于请求的消息?
【发布时间】:2021-02-18 22:28:05
【问题描述】:

我配置了一个简单的 SQS,我想一次处理 4 条消息。 在我的测试中,它有 2 个“可用”消息。当我收到消息时,它一次只产生 1 个。我做错了什么?

sqs = boto3.client('sqs')
response = sqs.receive_message(
    QueueUrl=queue_url,
    MaxNumberOfMessages=4
)

【问题讨论】:

    标签: python amazon-web-services boto3 amazon-sqs


    【解决方案1】:

    您没有做错任何事情,这是预期的行为。

    这是由于 SQS(以及大多数 AWS 服务)的分布式特性。基本上,并非所有节点都有所有可用的消息,并且您与之交谈的节点可能会返回 0 到 MaxNumberOfMessages 之间的任何数字(如果有的话)。要在一个呼叫中实际接收多条消息,您需要在队列中有 100 条或 1000 条以上的消息,即使这样,您也可能会很不走运并且收到的消息很少。

    来自docs

    如果队列中的消息数量很少(少于 1,000 条),您收到的消息很可能少于每次 ReceiveMessage 调用请求的消息。如果队列中的消息数量非常少,您可能不会在特定的 ReceiveMessage 响应中收到任何消息。如果发生这种情况,请重复请求。

    【讨论】:

    • 谢谢,@luk2302。我修改了我的代码以在len(msgs) < 4receive_message 的结果为空时获取消息。
    • @Lücks 请注意,即使有一条消息可用,您也可能收到 0 条消息 - 我不知道您的实际目标是什么,但只想指出,仅轮询直到 receive_message 是不够的0 一次。
    • 感谢您指出。这是一项一直在运行的工作,所以我在下一次迭代中遇到的最糟糕的情况。
    • @Lücks 那么你当然很好。您应该考虑添加长轮询,因为很多时候您不会收到任何消息,并且过于频繁地请求实际上会花费很多钱。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多