延迟在AWS上使用的λ话题上发布消息AWS-SDK iotData.publish

问题描述:

我使用AWS-SDK为下面的主题发布消息代码:延迟在AWS上使用的λ话题上发布消息AWS-SDK iotData.publish

var AWS = require('aws-sdk'); 
AWS.config.region = 'us-east-1'; 
AWS.config.credentials = { 
    accessKeyId: 'myaccesskeyid', 
    secretAccessKey: 'mysecretaccesskey' 
} 

function LEDOnIntent() { 
    this.iotdata = new AWS.IotData({ 
     endpoint: 'XXXXXXXXX.iot.us-east-1.amazonaws.com' 
    }); 
} 

LEDOnIntent.prototype.publishMessage = function() { 
    console.log('>publishMessage'); 
    var params = { 
     topic: 'test_topic', 
     /* required */ 
     payload: new Buffer('{action : "LED on"}') || 'STRING_VALUE', 
     qos: 1 
    }; 
    this.iotdata.publish(params, function(err, data) { 
     if (err) console.log(err, err.stack); // an error occurred 
     else { 
      console.log("Message published : " + data); // successful response 
     } 
    }); 
} 

它工作在当地的单元测试正常,但当我在AWS lambda上部署这些代码时,我的行为非常不平衡。对于前几个请求,它不会发布消息,那么当我不断测试它时它会正常工作。当我在休息一段时间后再测试时,它会再次停止为某些初始请求工作。

+0

它是不工作的时候并检查LAMBDA日志中CloudWatch的? –

+0

是的。它调用了lambda,但延迟发布消息。因此,当我点击请求时,我会在日志中看到“> publishMessage”,但不会显示“Message published:...” – Nidhish

+0

在休息后运行时有延迟的原因,我在答案中添加了这个延迟。有必要检查初始Lambda设置需要多长时间。你可以做什么是做初始发布,留下几秒钟,然后尝试后续请求。只是为了确定拖延会有多久 –

在幕后,Lambda像容器模型一样运行。它意味着在需要时创建容器,并在不需要容器时将其销毁。

您在初始请求中看到延迟的原因,因为它需要时间来设置容器并执行必要的引导,每次调用Lambda函数时都会增加一些延迟。您通常在第一次调用Lambda函数或更新Lambda函数时看到此延迟,因为AWS Lambda会尝试重复使用容器以用于后续调用Lambda函数。

AWS Lambda在预期另一个Lambda函数调用的情况下维护该容器一段时间。实际上,服务会在Lambda函数完成后冻结容器,并在AWS Lambda选择在再次调用Lambda函数时重新使用容器时解冻容器以供重用。

,请参阅官方文档here