使用setInterval函数连续调用相同的lambda函数时遇到了困难。
lambda函数
var MongoClient = require('mongodb').MongoClient
, format = require('util').format;
function funUpdateCommand(event,context,callback){
var mongoUrl='mongodb://**.**.**.**:*****/DBname';
// var mongoUrl='mongodb://127.0.0.1:27017/DBname';
MongoClient.connect(mongoUrl, function(err, db) {
if(err) throw err;
var collection = db.collection('device');
var interval = setInterval(function() {
collection.find({"deviceCommand.command":"getAudio","deviceCommand.timestamp":{ $lte: new Date((new Date)*1 - 60000*2)}}).toArray(function(err, results) {
if(err){
console.log(err);
}else{
for(var i=0;i<results.length;i++){
collection.update({_id:results[i]._id},{$set:{"deviceCommand.command":" "}},function(err, results) {
});
}
}
});
}, 5000);
});
context.succeed("Successfully uploaded");
}
exports.handler=funUpdateCommand;
&#13;
我正在尝试更新我的mongoDB中的一些文档,我需要将aws lambda函数作为连续后台作业运行,但是当使用setInterval时它会返回超时错误。
如何使用setInterval连续运行我的aws lambda函数?
答案 0 :(得分:3)
你不能让lambda永远运行。 Lambda函数的生命周期限制为300秒,300秒后,您的函数将死亡。您可以使用CloudWatch Events使用cron表达式调用相同的lambda函数。
您可以从here了解有关lambda限制的更多信息。
答案 1 :(得分:2)
在不排除其他潜在连接问题和超时的情况下,值得讨论的事实是Lambda函数并不意味着长时间运行。亚马逊已经设计了按需调用的平台,而不是像微服务一样运行或长时间保持活着。
你可以从马的嘴里读到它here:
问:AWS Lambda函数可以执行多长时间?
对AWS Lambda的所有调用必须在300秒内完成执行。默认超时为3秒,但您可以将超时设置为1到300秒之间的任何值。
您可以安排您的功能定期运行,连接,工作和断开连接。
答案 2 :(得分:0)
@taskiner是对的。 CloudWatch不支持每分钟更频繁的触发器,而Lambda的运行长度限制为300秒。你确实有几个选择:
<强>的setTimeout:强>
但是,您可以将CloudWatch配置为每分钟触发一次lambda,然后根据时间使用setTimeout
以下一个30秒的间隔运行代码,重复一次然后退出。
脱离我的头顶:
var THRITY_SECONDS = 30000;
module.exports.handler = function(context, event, callback) {
scheduleNext(runTask, function(){
scheduleNext(runTask, callback);
});
};
function scheduleNext(task, callback) {
var now = new Date().getTime();
var nextInterval = Math.ceil((new Date().getTime() / THIRTY_SECONDS) * THRITY_SECONDS);
var delay - nextInterval - now;
setTimeout(function() {
task(callback);
, delay);
}
function runTask(callback) {
// your code executes here
callback();
}
请注意,如果该功能运行40秒(从下午1:01:20开始,在1:01:30和1:02:00执行runTask
),您将被收取30美元的费用计算时间的秒数。您必须自己进行成本分析,并将其与运行t2.micro实例的成本进行比较(现场实例可以帮助降低成本)。
外部cron: 另一种选择是,如果您在其他地方拥有稳定的服务器资源,您可以让他们运行一个cron作业,该作业使用AWS CLI在您定义的计划上触发您的功能。
当然,如果您这样做,为什么不在所述服务器上运行任务?
事件触发器 Lambdas在事件触发器上运行,并且有几个支持的服务将在数据可用时触发lambda(s3桶/对象更改,DynamoDB更改等)。根据您的使用情况(看起来您正在查询mongodb以处理新数据)也许您可以向DynamoDB写一个事件并将您的lambda连接到表的流,或者如果您将音频文件保存到s3然后配置您的lambda听取新文件。在这里您将看到使用lambda的成本优势,因为它只会在有工作要做的时候运行。
答案 3 :(得分:-1)
我不知道aws是如何工作的,但你试过用cron吗? 例如,这将每小时启动YOURFUNCTION,
new CronJob("0 0 * * * *", YOURFUNCTION, null, true, 'America/Los_Angeles');