2017-10-12 74 views
0

我使用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上部署這些代碼時,我的行爲非常不平衡。對於前幾個請求,它不會發布消息,那麼當我不斷測試它時它會正常工作。當我在休息一段時間後再測試時,它會再次停止爲某些初始請求工作。

+0

它是不工作的時候並檢查LAMBDA日誌中CloudWatch的? –

+0

是的。它調用了lambda,但延遲發佈消息。因此,當我點擊請求時,我會在日誌中看到「> publishMessage」,但不會顯示「Message published:...」 – Nidhish

+0

在休息後運行時有延遲的原因,我在答案中添加了這個延遲。有必要檢查初始Lambda設置需要多長時間。你可以做什麼是做初始發佈,留下幾秒鐘,然後嘗試後續請求。只是爲了確定拖延會有多久 –

回答

0

在幕後,Lambda像容器模型一樣運行。它意味着在需要時創建容器,並在不需要容器時將其銷燬。

您在初始請求中看到延遲的原因,因爲它需要時間來設置容器並執行必要的引導,每次調用Lambda函數時都會增加一些延遲。您通常在第一次調用Lambda函數或更新Lambda函數時看到此延遲,因爲AWS Lambda會嘗試重複使用容器以用於後續調用Lambda函數。

AWS Lambda在預期另一個Lambda函數調用的情況下維護該容器一段時間。實際上,服務會在Lambda函數完成後凍結容器,並在AWS Lambda選擇在再次調用Lambda函數時重新使用容器時解凍容器以供重用。

,請參閱官方文檔here