【问题标题】:How to long poll amazon sqs service using boto?如何使用 boto 长轮询亚马逊 sqs 服务?
【发布时间】:2018-11-06 13:23:56
【问题描述】:

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

最近我发现numberofEmptyReceives 有1000 万,这意味着我正在接受这些请求。

以下是我消费消息的方式

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

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

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

具体

如果消息可用,调用会比 WaitTimeSeconds 更快返回。

从上面的句子看来,boto3 仍然调用sqs 来检查是否有消息。

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

设置thread.sleep这么简单吗?

我在github也找不到源代码

【问题讨论】:

  • 这个问题没有简单的解决方案。如果您有大量单独的批处理消息超时,则使用 SQS 为每条消息触发 lambda 可能会过大。增加轮询时间可能意味着服务响应缓慢。您需要提出自己的理由。

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


【解决方案1】:

只需在您的receive_message 调用中发送一个WaitTimeSeconds 参数(最多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 操作并等待长轮询超时,否则您可能不得不在同一时间段内执行两个或三个或更多计费操作。

【讨论】:

  • 对不起,我很困惑,If a message appears before the time expires, the call will return that message right away. 如果没有连续轮询,上述语句如何可能,因为 sqs 没有能力推送到我的服务器?如果它进行连续轮询,为什么它的请求比不等待WaitTimeSeconds
  • 往下看,API 可能正在进行连续轮询。在前一百万个免费请求之后,每百万个请求大约 0.40 美元,我从来不需要验证。但是,根据长轮询合同,您无需为该活动付费。
猜你喜欢
  • 1970-01-01
  • 2017-11-29
  • 2011-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-29
  • 1970-01-01
  • 2016-05-08
  • 2016-01-06
相关资源
最近更新 更多