如何使用boto长时间轮询amazon sqs服务?

时间:2018-05-28 01:34:24

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

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

最近我发现numberofEmptyReceives是1000万,这意味着我要对这些请求收费。

以下是我消费消息的方式

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

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

  

呼叫在返回之前等待消息到达队列的持续时间(以秒为单位)。   如果消息可用,则调用将比WaitTimeSeconds更快地返回。   如果没有可用的消息且等待时间到期,则呼叫将成功返回,并显示一个空的消息列表。

具体地

  

如果有消息可用,则呼叫会比WaitTimeSeconds更快地返回。

从上面的句子中可以看出boto3仍然会调用sqs来检查是否有消息。

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

是否像设置thread.sleep一样简单?

我也无法在github

上找到源代码

1 个答案:

答案 0 :(得分:2)

只需在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
)

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

有关详细信息,请参阅Enabling Long Polling in Amazon SQS

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