6

我已經使用無服務器框架實現了AWS Lambda函數。該Lambda函數使用RDS和MongoDB。 MongoDB端點運行大約500ms,但RDS在12秒(冷啓動)和〜3秒(熱啓動)運行。使用RDS時性能較差的AWS Lamba

注意:我在此端點中使用了Sequelize。

如何加速我的RDS Lambda端點?

回答

8

在您的功能模塊定義後的第一行,添加以下行

context.callbackWaitsForEmptyEventLoop = false; 

callbackWaitsForEmptyEventLoop

  • 的默認值是true
  • 有用的,只有修改的默認行爲回調。

即使事件循環中有事件,您也可以將此屬性設置爲false以請求AWS Lambda在調用回調後立即凍結該進程。 AWS Lambda將凍結進程,Node.js事件循環中的任何狀態數據和事件(下一次調用Lambda函數時處理事件循環中的任何剩餘事件,以及AWS Lambda選擇使用凍結進程時)。

更多細節閱讀this文章

+0

@alish,您已將此標記爲正確答案。請分享它在性能上有多大改進?你有3秒 - 12秒,你現在有什麼? – Zanon

0

您可以使用舊context.done功能立即或更具體context.succeed/context.fail返回。此功能在節點4上仍然可用。

儘管它不會突然終止正在運行的Lambda,但會給予調用方(如API網關)的響應並在後臺運行,如果需要,最多可以運行~15秒。有趣的額外:如果你使用setTimeout安排一個稍後運行的函數,那麼你可以免費運行〜15秒,因爲Lambda只負責顯式異步函數調用。

+0

你有任何文件來支持你的答案嗎?我找不到任何。我認爲事件循環中剩下的任何東西都會在下一次調用時運行。 – Alex

+0

哪部分?上下文功能是AWS Lambda編程模型的一部分(http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-using-old-runtime.html#nodejs-prog-model- oldruntime-context-methods),但雖然已經過時,但它仍然存在以便向後兼容,您可以測試這一點。 'setTimeout'延遲是一個無證的瑣事。 –