node.js - AWS Lambda 在向 SQS 发送消息之前完成

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

我在 AWS 上运行“Node.JS”lambda,它向 SQS 发送消息。 由于某些原因,SQS 回调函数每两次调用仅执行一次。看起来运行 lambda 的线程完成了运行(因为它不是对 SQS 的同步调用,也不能返回 Future),因此 lambda 不会“保持事件状态”以执行回调。

如何解决这个问题并让 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,'');  
    }
});

};

最佳答案

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

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
  }
};

附言在处理程序中实例化 aws 类在 lambda 环境中不是一个好主意,因为它会增加冷启动时间。最好将 new AWS.SQS(...) 操作和 AWS.config.update() 也移出处理程序,因为这些操作将在每次调用时执行处理程序,但您确实需要它们只执行一次。

关于node.js - AWS Lambda 在向 SQS 发送消息之前完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56269829/

相关文章:

amazon-web-services - DynamoDB : List all partition keys

amazon-web-services - 如何使用 boto 启动带有 rds 资源的弹性 beantalk

node.js - 使用aws cognito权限规则自定义node.js api的授权

javascript - 未捕获( promise 中)SyntaxError : Unexpected end of input in React when fetching the API

mysql - 无法更新的 Sequelize 列

javascript - 如何创建应用独立的通知服务器?

java - 如何在亚马逊EC2上运行服务器套接字

javascript - 为什么cb异步运行时仍然定义了这个var?

javascript - Google Analytics 异步事件跟踪

ios - 使用 SDWebImage 一次下载两个图像