为什么我的 Amazon SQS 费用高于预期水平?

上次更新日期:2021 年 7 月 23 日

向我收取的 Amazon Simple Queue Service (Amazon SQS) 的费用高于根据我的使用情况预测的费用。

-或者-

我达到了 Amazon SQS 免费套餐限制,但是我在账单周期内只发送了几条消息。

我如何更好地了解 Amazon SQS 费用,以及如何降低 Amazon SQS 成本?

简短描述

出现大量 SQS 请求的最常见原因是空接收,它们被计为不返回消息的 ReceiveMessage 请求。Amazon SQS 费用基于请求量以及传入和传出 Amazon SQS 的数据。轮询 SQS 队列的使用器会持续地产生接收空。即使您的 SQS 队列未发送或接收消息,这些空接收也会按照 Amazon SQS 定价收取费用。

解决方法

查看 NumberOfEmptyReceives CloudWatch 指标

为了确定空接收是否导致高 Amazon SQS 收费,请查看适用于 SQS 队列的 Amazon CloudWatch NumberOfEmptyReceives 指标。空接收数量较高表示使用器正在发出大量 ReceiveMessage 请求。

验证 SQS 队列是否配置为调用 Lambda 函数

当 SQS 队列配置为调用 AWS Lambda 函数时,Lambda 对队列进行长轮询。这意味着,即使不使用 SQS 队列,Lambda 函数调用也会产生空接收和相关收费。

降低 Amazon SQS 成本的最佳实践

遵循以下最佳实践以最大限度地降低 Amazon SQS 成本:

删除不需要的队列

为了防止对非活动队列发出 ReceiveMessage 请求,请考虑在不再需要 SQS 队列时删除它们。

缩减使用器

横向扩展用于随着卷要求的升高增加消息创建器和使用器的数量,从而最大限度地提高 Amazon SQS 队列吞吐量。同样,当消息速率降低时,请务必缩小使用器的规模,以防止产生不必要的 ReceiveMessage 请求。

长轮询

Amazon SQS 长轮询有助于降低成本并减少空接收。您可以将 ReceiveMessage 等待时间设置为最多 20 秒以激活长轮询。您可以使用下面的任何一种方法指定等待时间:

  • 在队列级别,您可以配置 ReceiveMessageWaitTimeSeconds 队列属性。
  • 在消息级别,您可以使用 ReceiveMessageWaitTime 参数发送 ReceiveMessage API 调用。
    注意:在 ReceiveMessage API 中的消息级别设置 ReceiveMessageWaitTime 参数将会覆盖在队列级别配置的参数值。对于使用 Amazon SQS 调用的 Lambda 函数,Lambda 使用长轮询来轮询队列。

分批操作

Amazon SQS 定价基于请求数量。您可以通过批处理消息操作来减少请求数量,进而降低成本。例如,可以将单个SendMessageBatch 操作配置为发送 10 条消息,而不是调用 SendMessage API 10 次。其他可用的分批操作包括 DeleteMessageBatchChangeMessageVisibilityBatch


这篇文章对您有帮助吗?


您是否需要账单或技术支持?