使用Node.js Aws-sdk获取SQS可用消息与在途消息数量如何实现?
基于AWS SDK for JavaScript获取SQS队列指标的实现方案
核心说明
你需要的两个指标对应SQS的内置属性:
- 可用消息数:对应
ApproximateNumberOfMessages,指队列中等待被消费的消息总数 - 在途(in-flight)消息数:对应
ApproximateNumberOfMessagesNotVisible,指已经被消费者拉取、但还未完成删除操作、处于不可见窗口期的消息总数
获取这两个指标可以直接调用SQS的getQueueAttributes接口,你已经可以正常收发SQS消息,说明现有权限已经满足接口调用要求,不需要额外配置权限。
代码示例
AWS SDK v2 版本(旧版常用)
const AWS = require('aws-sdk'); // 如果你已经完成过AWS全局配置,可省略以下配置步骤 AWS.config.update({ region: '替换为你的AWS区域,例如ap-northeast-1' }); const sqs = new AWS.SQS(); const queueUrl = '替换为你的SQS队列URL'; const getSqsMetrics = async () => { const params = { QueueUrl: queueUrl, AttributeNames: [ 'ApproximateNumberOfMessages', 'ApproximateNumberOfMessagesNotVisible' ] }; try { const response = await sqs.getQueueAttributes(params).promise(); // 接口返回属性为字符串格式,需转为数字做数值判断 const availableMessages = Number(response.Attributes.ApproximateNumberOfMessages); const inFlightMessages = Number(response.Attributes.ApproximateNumberOfMessagesNotVisible); // 此处可添加你的负载判断逻辑,例如可用消息超过阈值触发告警 console.log('可用消息数:', availableMessages); console.log('在途消息数:', inFlightMessages); return { availableMessages, inFlightMessages }; } catch (err) { console.error('获取SQS属性失败:', err); throw err; } }; // 调用示例 getSqsMetrics();
AWS SDK v3 版本(新版模块化推荐)
import { SQSClient, GetQueueAttributesCommand } from "@aws-sdk/client-sqs"; // 可复用你现有逻辑中已经初始化完成的SQSClient实例,无需重复创建 const sqsClient = new SQSClient({ region: "替换为你的AWS区域" }); const queueUrl = "替换为你的SQS队列URL"; const getSqsMetrics = async () => { const command = new GetQueueAttributesCommand({ QueueUrl: queueUrl, AttributeNames: [ "ApproximateNumberOfMessages", "ApproximateNumberOfMessagesNotVisible" ] }); try { const response = await sqsClient.send(command); const availableMessages = Number(response.Attributes.ApproximateNumberOfMessages); const inFlightMessages = Number(response.Attributes.ApproximateNumberOfMessagesNotVisible); // 负载判断示例:可用消息超过1000条且在途消息占比超过80%判定为高负载 const isHighLoad = availableMessages > 1000 && (inFlightMessages / (availableMessages + inFlightMessages)) > 0.8; console.log('可用消息数:', availableMessages); console.log('在途消息数:', inFlightMessages); console.log('是否高负载:', isHighLoad); return { availableMessages, inFlightMessages, isHighLoad }; } catch (err) { console.error("获取SQS属性失败:", err); throw err; } }; // 调用示例 getSqsMetrics();
注意事项
- 两个指标均为近似统计值,SQS作为分布式队列,统计结果会有几秒的延迟,适合做整体负载趋势判断,不适合用于精确计数场景
- 负载判断可结合两个指标的变化趋势:如果
ApproximateNumberOfMessages持续上涨,说明消费者消费速度跟不上生产速度,需要扩容消费者;如果ApproximateNumberOfMessagesNotVisible长期处于高位,说明消费者处理消息过慢,或有大量消息处理失败未删除,重复进入不可见状态 - 调用接口时仅传需要的属性名即可,不要传
All获取全量属性,减少不必要的性能开销
内容的提问来源于stack exchange,提问作者Rohit Mittal
相关产品推荐
相关产品推荐

