2015-05-19 32 views
3

我在寫一個與端點通信的Lambda函數。如果發生500錯誤,我希望函數重試幾次。AWS中的重試次數Lambda

我希望做這樣的事情我exports.handler函數內部:

exports.handler = function(event, context){ ... 
    if (!error && response.statusCode >= 500 && response.statusCode < 600) { 
    if (event.retries <= 5) { 
     setTimeout(exports.handler(event, context), 60000); 
    } 
    }... 

I'm wondering what the correct thing to do with the context variable is.

我上面提到的代碼後,我應該context.fail()?或者我應該等待context.succeed()context.fail()發生在此重試過程的後續迭代中?

我只是隨便如果在原來的exports.handler的層面解決每個context需求,它出現,或者很難決定是否context可以解決任何水平,這將解決它整個Lambda執行。

感謝您的任何建議。

回答

7

到這裏看看:

http://aws.amazon.com/lambda/faqs/

功能將運行到3倍的λ放棄之前。

如果你調用「context.succeed」,lambda不會重試,但是(它假定你的函數是成功的)。

調用「context.fail」將導致您的函數被重試。

有一點需要注意:您必須小心在正確的時間調用「context.succeed」或「context.fail」。如果您調用尚未處理的掛起回調函數,那麼您的Lambda函數將提前掛起,並且可能會運行一些代碼。因此,調用context.succeed或context.fail的最佳位置是回調函數,並且您知道不需要執行其他處理。

這也是值得一試,這篇文章,以及:

https://aws.amazon.com/blogs/compute/container-reuse-in-lambda/

+0

感謝您的輸入。一段時間以來,我們一直在使用上面描述的(我們自己的重試),但是我們沒有對它進行測試以確保它的行爲符合預期。如果我不得不依靠cloudwatch日誌,那麼看看事情是否正常工作會有點難。它*似乎*表現正確... – rschwieb

+0

重試只取決於context.failed或context.succeed,因爲我有情境,我是context.succeed回調但我的lambda仍然重試 – Marko

+0

如果發生任何錯誤,Lambda可能會重試除了調用context.fail。例如,如果你的函數超時,或者拋出一個異常。另外,在主處理程序中是否有任何代碼路徑導致它在未調用完成或成功的情況下返回,或者是否存在不保證其中一個的回調序列? –