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); }
技术问询
- 为何「已发送消息数」指标显示为10而非1?(批量消息总大小小于64KB)
- 「已发送消息数」指标的计数是否为AWS的计费依据?
- 如何追踪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,就能看到详细的请求细节。
- 使用AWS CloudTrail:它会记录所有针对SQS的API调用,包括
- 计费统计API请求数:
AWS对批量操作的请求数统计是按请求内包含的消息数量来计算的:- 比如一个包含10条消息的
SendMessageBatch请求,会被统计为10个请求单位; - 单个
SendMessage请求则统计为1个请求单位; - 同理,
DeleteMessageBatch等其他批量操作,也是按其中的消息条目数来计数请求单位。
- 比如一个包含10条消息的
内容的提问来源于stack exchange,提问作者Akashsingla19
相关产品推荐
相关产品推荐

