2016-11-14 67 views
0

我在使用setInterval函數連續調用相同的lambda函數時遇到了困難。如何在aws lambda函數中使用setInterval

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() { 
 
\t collection.find({"deviceCommand.command":"getAudio","deviceCommand.timestamp":{ $lte: new Date((new Date)*1 - 60000*2)}}).toArray(function(err, results) {   
 
\t \t   if(err){ 
 
\t \t   \t console.log(err); 
 
\t \t   }else{ 
 
\t \t \t   for(var i=0;i<results.length;i++){ 
 
\t \t \t \t   collection.update({_id:results[i]._id},{$set:{"deviceCommand.command":" "}},function(err, results) { 
 
\t \t \t \t \t \t \t 
 
\t \t \t \t \t }); \t 
 
\t \t \t  } \t 
 
\t \t  } 
 
\t  }); 
 
    }, 5000); 
 
}); 
 

 
context.succeed("Successfully uploaded"); 
 

 
} 
 

 
exports.handler=funUpdateCommand;

我想更新一下我的MongoDB的文件,我需要運行AWS lambda函數作爲一個連續的後臺作業,但使用的setInterval時它會返回超時錯誤。

我該如何使用setInterval連續運行我的aws lambda函數?

回答

3

你不能讓lambda永遠運行。 Lambda函數的使用壽命受到300秒的限制,在300秒後,您的功能會死亡。您可以使用CloudWatch Events使用cron表達式調用相同的lambda函數。

您可以從here瞭解更多關於lambda限制的信息。

+0

嗨taskiner,使用CloudWatch Events觸發aws lambda函數,現在它每隔1分鐘調用一次,但我需要每隔30秒調度一次!那可能嗎?如果是的話如何? – Sabreena

+0

不幸的是CloudWatch Event不支持二級精度。 – taskiner

+0

好的,謝謝taskiner :-) – Sabreena

2

在不排除其他潛在的連接問題和超時的情況下,值得討論的一個事實是Lambda函數並不意味着長時間運行。亞馬遜已經設計了按需呼叫的平臺,而不是像微服務那樣運行或長時間保持活力。

您可以從馬的嘴here閱讀:

問:多長時間可以在AWS lambda函數執行呢?

所有對AWS Lambda的調用必須在300秒內完成執行。默認超時時間爲3秒,但您可以將超時設置爲1到300秒之間的任何值。

您可以安排您的功能定期運行,連接,工作和斷開連接。

-1

我不知道aws是如何工作的,但是你用cron試過了嗎? 例如,這將啓動yourFunction中的每個小時,

new CronJob("0 0 * * * *", YOURFUNCTION, null, true, 'America/Los_Angeles'); 

https://www.npmjs.com/package/cron

+0

這不適用於AWS Lambda。 –

0

@taskiner是正確的。 CloudWatch不支持觸發器的頻率高於每分鐘一次,而Lambda的運行長度限制爲300秒。你有幾個選擇,但:

的setTimeout: 你可以不過配置CloudWatch的觸發你的拉姆達的每一分鐘,然後你可以,基於時間的使用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秒,執行runTask在1:01:30和1: 02:00)你將被收取30秒的計算時間。您必須親自進行成本分析,並將其與諸如運行t2.micro實例的成本(現場實例可幫助降低成本)進行比較。

外部的cron: 另一種選擇是,如果你有服務器資源,其他地方都是穩定的,你可以讓他們運行它使用AWS CLI觸發您定義的日程安排你的函數cron作業。

當然,如果你這樣做,爲什麼不在上述服務器上運行任務?

事件觸發 lambda表達式事件觸發運行,並有幾個支持的服務時,數據變爲可用(S3桶/對象的變化,DynamoDB的變化等),將觸發拉姆達。根據您的用例(看起來您正在查詢mongodb以處理新數據),也許您可​​以將事件寫入DynamoDB並將您的lambda連接到表流,或者如果您要將音頻文件保存爲s3,則配置您的lambda聆聽新文件。在這裏你會看到使用lambda的成本優勢,因爲它只會在有工作要做時才運行。