【问题标题】:How to use setInterval in aws lambda function如何在 aws lambda 函数中使用 setInterval
【发布时间】:2016-11-15 21:52:58
【问题描述】:

我在使用 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;

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

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

【问题讨论】:

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


    【解决方案1】:

    你不能让 lambda 永远运行。 Lambda 函数的生命周期限制为 300 秒,300 秒后,您的函数将终止。您可以使用 CloudWatch Events 使用 cron 表达式调用相同的 lambda 函数。

    您可以从here 了解有关 lambda 限制的更多信息。

    【讨论】:

    • 您好 taskiner,使用 CloudWatch Events 触发 aws lambda 函数,现在它每 1 分钟调用一次,但我需要每 30 秒安排一次!那可能吗?如果是怎么办?
    • 很遗憾 CloudWatch Event 不支持秒级精度。
    • 好的,谢谢 taskiner :-)
    【解决方案2】:

    在不排除其他潜在的连接问题和超时的情况下,值得讨论的事实是 Lambda 函数并不意味着长时间运行。亚马逊将平台设计为按需调用,而不是像微服务一样运行或长时间保持活力。

    你可以从马口中读出来here

    问:AWS Lambda 函数可以执行多长时间?

    对 AWS Lambda 的所有调用必须在 300 秒内完成执行。默认超时为 3 秒,但您可以将超时设置为 1 到 300 秒之间的任何值。

    您可以安排函数定期运行、连接、工作和断开连接。

    【讨论】:

      【解决方案3】:

      @taskiner 是正确的。 CloudWatch 不支持每分钟一次以上的触发器,并且 Lambda 的运行时间限制为 300 秒。不过,您确实有几个选择:

      设置超时: 但是,您可以将 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 按照您定义的时间表触发您的函数。

      当然,如果您这样做,为什么不在所述服务器上运行任务?

      事件触发 Lambda 在事件触发器上运行,并且有几个受支持的服务将在数据可用时触发您的 lambda(s3 存储桶/对象更改、DynamoDB 更改等)。根据您的用例(看起来您正在查询 mongodb 以获取要处理的新数据)也许您可以将事件写入 DynamoDB 并将您的 lambda 连接到表的流,或者如果您将音频文件保存到 s3 然后配置您的 lambda收听新文件。这是您将看到使用 lambda 的成本优势的地方,因为它只会在有工作要做时运行。

      【讨论】:

        猜你喜欢
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 2022-01-27
        • 2021-03-20
        • 2019-10-30
        • 2016-03-25
        • 1970-01-01
        • 2017-06-04
        相关资源
        最近更新 更多