Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何聚合AWS SQS消息_Node.js_Amazon Web Services_Amazon Sqs_Aws Lambda - Fatal编程技术网

Node.js 如何聚合AWS SQS消息

Node.js 如何聚合AWS SQS消息,node.js,amazon-web-services,amazon-sqs,aws-lambda,Node.js,Amazon Web Services,Amazon Sqs,Aws Lambda,给定X个SQS队列,如何将近似EnumberOfMessages聚合为一个CloudWatch度量 我希望根据队列中的邮件数量自动调整组规模。使用多个CloudWatch报警(每个队列一个)会导致问题,因为一个队列将是空的,而其他队列“已满”。我实现这一点的方法是使用AWS Lambda with Node.js。我添加了一个CloudWatch事件触发器以每分钟运行lambda函数。这将查询sqs队列,然后创建一个自定义的CloudWatch度量,您可以使用该度量对自动缩放组进行缩放 var

给定X个SQS队列,如何将近似EnumberOfMessages聚合为一个CloudWatch度量


我希望根据队列中的邮件数量自动调整组规模。使用多个CloudWatch报警(每个队列一个)会导致问题,因为一个队列将是空的,而其他队列“已满”。

我实现这一点的方法是使用AWS Lambda with Node.js。我添加了一个CloudWatch事件触发器以每分钟运行lambda函数。这将查询sqs队列,然后创建一个自定义的CloudWatch度量,您可以使用该度量对自动缩放组进行缩放

var AWS = require('aws-sdk');
var sqs = new AWS.SQS();
var cloudWatch = new AWS.CloudWatch();

var queueUrls = ['https://sqs.REGION.amazonaws.com/ACCOUNT-NUMBER/queueUrl1','https://sqs.REGION.amazonaws.com/ACCOUNT-NUMBER/queueUrl2'];

exports.handler = (event, context, callback) => {
    var fn = function (url) {
        return new Promise(resolve => {
            var sqsParams = {
                AttributeNames: ['ApproximateNumberOfMessages'],
                QueueUrl: url
            };

            sqs.getQueueAttributes(sqsParams, function(err,data){
                if(err)
                {
                    console.log(err,err.stack);
                    context.fail(err);
                }
                else
                {
                    resolve({name: url.split('/').pop(), messageCount: parseInt(data.Attributes.ApproximateNumberOfMessages)});
                }
            }); 
        });
    };

    var actions = queueUrls.map(fn);
    Promise.all(actions).then(function(queues) {
        var messageCount = queues.map(function(m){return m.messageCount;});
        var queueNames = queues.map(function(n){return n.name;}).join();

        var metricParams = {
            MetricData:[{
                MetricName: 'ApproximateNumberOfMessages',
                Dimensions:[{
                    Name: 'QueueName',
                    Value: queueNames
                }],
                Unit: 'Count',
                StatisticValues: {
                    Maximum: Math.max.apply(Math, messageCount),
                    Minimum: Math.min.apply(Math, messageCount),
                    SampleCount: queues.length,
                    Sum: messageCount.reduce((pv, cv) => pv+cv, 0)
                }
            }],
            Namespace: 'AWS/SQS'
        };
        cloudWatch.putMetricData(metricParams, function(err, metricData){
            if(err) console.log(err,err.stack);
            else console.log(metricData);
        });
    });
};
这段代码显然可以优化以处理2个以上的队列,并且可能会受益于异步瀑布

编辑:更新为使用承诺

EDIT2:连接CloudWatch度量的队列名称