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'延迟是一个无证的琐事。 –