延迟在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上部署这些代码时,我的行为非常不平衡。对于前几个请求,它不会发布消息,那么当我不断测试它时它会正常工作。当我在休息一段时间后再测试时,它会再次停止为某些初始请求工作。
答
在幕后,Lambda像容器模型一样运行。它意味着在需要时创建容器,并在不需要容器时将其销毁。
您在初始请求中看到延迟的原因,因为它需要时间来设置容器并执行必要的引导,每次调用Lambda函数时都会增加一些延迟。您通常在第一次调用Lambda函数或更新Lambda函数时看到此延迟,因为AWS Lambda会尝试重复使用容器以用于后续调用Lambda函数。
AWS Lambda在预期另一个Lambda函数调用的情况下维护该容器一段时间。实际上,服务会在Lambda函数完成后冻结容器,并在AWS Lambda选择在再次调用Lambda函数时重新使用容器时解冻容器以供重用。
,请参阅官方文档here
它是不工作的时候并检查LAMBDA日志中CloudWatch的? –
是的。它调用了lambda,但延迟发布消息。因此,当我点击请求时,我会在日志中看到“> publishMessage”,但不会显示“Message published:...” – Nidhish
在休息后运行时有延迟的原因,我在答案中添加了这个延迟。有必要检查初始Lambda设置需要多长时间。你可以做什么是做初始发布,留下几秒钟,然后尝试后续请求。只是为了确定拖延会有多久 –