如何使用 boto 长时间轮询亚马逊 sqs 服务?

J L*_*J L 4 boto amazon-sqs amazon-web-services boto3

我在亚马逊上有一个 sqs 队列,有几个消费者在轮询它。

最近我发现numberofEmptyReceives有 1000 万,这意味着我正在根据这些请求收费。

以下是我消费消息的方式

while True:
    for message in queue.receive_messages(AttributeNames=['All'], MaxNumberOfMessages=10):
Run Code Online (Sandbox Code Playgroud)

我知道有WaitTimeSeconds选项,但文档似乎表明它不做长轮询

调用在返回之前等待消息到达队列的持续时间(以秒为单位)。如果消息可用,则该调用会早于 WaitTimeSeconds 返回。如果没有消息可用并且等待时间到期,则调用成功返回,并带有空消息列表。

具体来说

如果消息可用,则该调用会早于 WaitTimeSeconds 返回。

从上面的句子似乎boto3仍然建议调用sqs以检查是否有消息。

使用 boto3 进行长时间轮询以避免收取请求费用的正确方法是什么?

设置这么简单thread.sleep吗?

我在github上也找不到源代码

cra*_*eld 6

只需WaitTimeSeconds在您的receive_message通话中发送一个参数(最多 20 秒)。从 AWS 文档:

# Long poll for message on provided SQS queue
response = sqs.receive_message(
    QueueUrl=queue_url,
    AttributeNames=[
        'SentTimestamp'
    ],
    MaxNumberOfMessages=1,
    MessageAttributeNames=[
        'All'
    ],
    WaitTimeSeconds=20
)
Run Code Online (Sandbox Code Playgroud)

如果队列中没有消息,则调用将等待WaitTimeSeconds消息出现。如果在时间到期之前出现消息,呼叫将立即返回该消息。

有关更多详细信息,请参阅在 Amazon SQS 中启用长轮询

您仍需为长轮询请求付费。成本节约在于执行一个可计费的 SQS 操作并等待长轮询超时,否则您可能不得不在同一时间段内执行两个或三个或更多的计费操作。