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

1 分钟阅读
0

向我收取的 Amazon Simple Queue Service (Amazon SQS) 的费用高于根据我的使用情况预测的费用。或者,我达到了 Amazon SQS 免费套餐限制,但我在账单周期内只发送了几条消息。我如何更好地了解 Amazon SQS 费用,以及如何降低 Amazon SQS 成本?

简短描述

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

解决方法

查看 CloudWatch 指标 NumberOfEmptyReceives

要确定空接收是否导致较高的 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


相关信息

降低 Amazon SQS 成本