在向SQS发送消息之前,AWS Lambda完成

时间:2019-05-23 07:09:44

标签: node.js amazon-web-services asynchronous aws-lambda amazon-sqs

我正在AWS上运行“ Node.JS” lambda,它将消息发送到SQS。 由于某些原因, SQS回调函数每两次调用只能执行一次。看起来,运行lambda的线程完成了运行(因为这不是对SQS的同步调用,也无法返回Future),因此lambda不会“保持活动状态”以使回调得以执行。 / p>

我该如何解决此问题并使lambda等待SQS回调执行?

这是我的lambda代码:

exports.handler = async (event, context) => {

// Set the region
AWS.config.update({region: 'us-east-1'});

// Create an SQS service object
var sqs = new AWS.SQS({apiVersion: '2012-11-05'});
const SQS_QUEUE_URL = process.env.SQS_QUEUE_URL;

var params = {
    MessageGroupId: "cv",
    MessageDeduplicationId: key,
    MessageBody: "My Message",
    QueueUrl: SQS_QUEUE_URL
};

console.log(`Sending notification via SQS: ${SQS_QUEUE_URL}.`);
sqs.sendMessage(params, function(err, data) {   //<-- This function get called about one time every 4 lambda calls
    if (err) {
        console.log("Error", err);
        context.done('error', "ERROR Put SQS");  
    } else {
        console.log("Success", data.MessageId);
        context.done(null,'');  
    }
});

};

1 个答案:

答案 0 :(得分:1)

您应该坚持采用基于回调的方法,或者采用基于Promise的方法。我建议您使用后者:

const allowedStatus = ["APPROVED_LOCKED", "LOCKED" ];

data.filter(filter => allowedStatus.includes(filter.state));

P.S。在lambda环境中实例化处理程序中的aws类不是一个好主意,因为它会增加冷启动时间。最好也将exports.handler = async (event, context) => { // Set the region AWS.config.update({region: 'us-east-1'}); // Create an SQS service object var sqs = new AWS.SQS({apiVersion: '2012-11-05'}); const SQS_QUEUE_URL = process.env.SQS_QUEUE_URL; var params = { MessageGroupId: "cv", MessageDeduplicationId: key, MessageBody: "My Message", QueueUrl: SQS_QUEUE_URL }; console.log(`Sending notification via SQS: ${SQS_QUEUE_URL}.`); try { await sqs.sendMessage(params).promise(); // since your handler returns a promise, lambda will only resolve after sqs responded with either failure or success } catch (err) { // do something here } }; 操作移出处理程序,再移出new AWS.SQS(...),因为这些操作将在处理程序的每次调用时执行,但实际上您只需要执行一次即可。