You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS SQS API请求计数逻辑及批量消息指标相关疑问

SQS批量发送消息的指标与计费疑问

我使用Java客户端AmazonSQSBufferedAsyncClient实现SQS批量消息发送,一次发送10条消息,但SQS监控的「已发送消息数」「已接收消息数」「已删除消息数」指标均显示为10,而非预期的1。

创建缓冲客户端的代码

final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient(SQSConfig.getCreds());

final QueueBufferConfig config = new QueueBufferConfig()
        .withMaxBatchOpenMs(10000)
        .withMaxBatchSize(10)
        .withMaxInflightReceiveBatches(2)
        .withMaxDoneReceiveBatches(15);

config.setLongPoll(true);

bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync, config);

发送消息的代码

public void sendBufferMessageInBatch(String message, String messageGroupId) throws ExecutionException, InterruptedException {

    SendMessageBatchRequest sqsBatchRequest = new SendMessageBatchRequest();

    sqsBatchRequest.setQueueUrl(SQSConfig.endpoint);
    List<SendMessageBatchRequestEntry> entryList = Stream.iterate(1, i -> i < 11, i -> i + 1)
            .map(numb -> {
                String sendMessage = message;
                sendMessage = sendMessage + "_" + numb;
                sendMessage = sendMessage + "_" + messageGroupId;
                SendMessageBatchRequestEntry entry = new SendMessageBatchRequestEntry();
                entry.setMessageBody(sendMessage);
                entry.setId("id_" + numb);
                printSendMessage(sendMessage);
                return entry;
            })
            .collect(Collectors.toList());

    sqsBatchRequest.setEntries(entryList);
    Future<SendMessageBatchResult> sendBatchMessageFuture = SQSConfig.bufferedSqs.sendMessageBatchAsync(sqsBatchRequest);
}

技术问询

  1. 为何「已发送消息数」指标显示为10而非1?(批量消息总大小小于64KB)
  2. 「已发送消息数」指标的计数是否为AWS的计费依据?
  3. 如何追踪SQS执行的API请求?AWS计费时是如何统计API请求数的?

解答

1. 「已发送消息数」显示为10的原因

AmazonSQSBufferedAsyncClient的缓冲功能是针对单个SendMessage请求的自动批量聚合——也就是当你多次调用sendMessageAsync时,客户端会把这些单个消息攒成批量请求再发送。但你现在直接调用的是sendMessageBatchAsync,传入了一个包含10条消息的SendMessageBatchRequest,客户端不会对这个批量请求再做合并或拆分,会直接转发给SQS服务。

SQS监控里的「已发送消息数」指标统计的是实际写入队列的消息条数,而不是API请求的次数。你一次发送了10条消息,所以指标显示10,这是符合预期的。

2. 「已发送消息数」与计费的关系

是的,这个指标的计数和SQS计费直接相关。SQS的计费核心维度包括:

  • 请求单位数量:对于批量请求(如SendMessageBatch),每条消息会被算作1个请求单位(标准队列和FIFO队列均是如此)。你发送10条消息的批量请求,会被计为10个请求单位,这和「已发送消息数」的数值一致。
  • 另外还有数据传输量、消息存储时长等计费项,但「已发送消息数」对应的是请求单位的核心计数依据之一。

3. 追踪API请求与计费统计方式

  • 追踪API请求:
    • 使用AWS CloudTrail:它会记录所有针对SQS的API调用,包括SendMessageBatch、ReceiveMessage等操作的请求参数、调用时间、身份信息等,你可以在CloudTrail控制台或日志中查看具体的请求记录。
    • 启用AWS SDK日志:在Java SDK中配置日志级别为DEBUG,可以记录客户端发送的所有API请求和服务端响应,比如通过log4j或slf4j配置,将com.amazonaws.services.sqs的日志级别设为DEBUG,就能看到详细的请求细节。
  • 计费统计API请求数:
    AWS对批量操作的请求数统计是按请求内包含的消息数量来计算的:
    • 比如一个包含10条消息的SendMessageBatch请求,会被统计为10个请求单位;
    • 单个SendMessage请求则统计为1个请求单位;
    • 同理,DeleteMessageBatch等其他批量操作,也是按其中的消息条目数来计数请求单位。

内容的提问来源于stack exchange,提问作者Akashsingla19

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:02:44