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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 02:18:01