如何在aws lambda函数中使用setInterval

时间:2016-11-14 13:44:39

标签: javascript node.js mongodb amazon-web-services aws-lambda

使用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;
&#13;
&#13;

我正在尝试更新我的mongoDB中的一些文档,我需要将aws lambda函数作为连续后台作业运行,但是当使用setInterval时它会返回超时错误。

如何使用setInterval连续运行我的aws lambda函数?

4 个答案:

答案 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');

请参阅https://www.npmjs.com/package/cron