我在亚马逊上有一个sqs队列,有几个消费者轮询它。
最近我发现numberofEmptyReceives
是1000万,这意味着我要对这些请求收费。
以下是我消费消息的方式
while True:
for message in queue.receive_messages(AttributeNames=['All'], MaxNumberOfMessages=10):
我知道有WaitTimeSeconds
选项,但文档似乎暗示它不做长轮询
呼叫在返回之前等待消息到达队列的持续时间(以秒为单位)。 如果消息可用,则调用将比WaitTimeSeconds更快地返回。 如果没有可用的消息且等待时间到期,则呼叫将成功返回,并显示一个空的消息列表。
具体地
如果有消息可用,则呼叫会比WaitTimeSeconds更快地返回。
从上面的句子中可以看出boto3
仍然会调用sqs
来检查是否有消息。
使用boto3进行长轮询的正确方法是什么,以避免收取请求费用?
是否像设置thread.sleep
一样简单?
我也无法在github
上找到源代码答案 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操作并等待长轮询超时,否则您可能不得不在同一时间内执行两次或三次或更多的计费操作。