使用RDS时,AWS Lambda表现不佳

7
我使用Serverless Framework实现了一个AWS Lambda函数。该Lambda函数使用RDS和MongoDB。MongoDB端点运行时间约为500毫秒,但RDS在冷启动时需要12秒左右,在热启动时需要约3秒钟。
注意:我在此端点中使用Sequelize。
如何加快我的RDS Lambda端点速度?
2个回答

11
在您的函数模块定义后的第一行添加以下内容。
context.callbackWaitsForEmptyEventLoop = false;

callbackWaitsForEmptyEventLoop

  • 默认值为true。
  • 仅在修改回调函数的默认行为时有用。

您可以将此属性设置为false,以请求AWS Lambda在回调被调用后立即冻结进程,即使事件循环中有事件。 AWS Lambda将冻结进程,任何状态数据和Node.js事件循环中的事件(在Lambda函数下一次被调用时处理事件循环中剩余的事件,如果AWS Lambda选择使用冻结的进程)。

更多详细信息请阅读文章。


@alish,你已经将这个标记为正确答案了。能否分享一下性能有多大的提升?之前是3秒到12秒,现在是多少呢? - Zanon
最初我这边需要7-8秒钟才能执行完毕,现在大约只需要2-3秒钟的时间。非常感谢您提供的解决方案。 - Dikshit Kathuria

0

您可以使用旧的context.done函数立即返回,或更具体地使用context.succeed/context.fail。此函数仍可在Node 4上使用。

虽然它不会突然结束运行中的Lambda,但会向调用者(如API网关)返回响应,并在后台继续运行,如果需要的话,最多持续约15秒。

有趣的额外说明:如果您使用setTimeout安排稍后运行的函数,则可以免费运行约15秒,因为Lambda仅保留对显式异步函数调用的收费。


你有任何文件可以支持你的答案吗?我找不到任何文件。我以为事件循环中剩下的所有内容都会在下一次调用时运行。 - Alex
哪一部分?上下文函数是AWS Lambda编程模型的一部分(http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-using-old-runtime.html#nodejs-prog-model-oldruntime-context-methods),但尽管它已经过时,但仍然存在于向后兼容性中,您可以测试此点。 setTimeout 延迟是一个未记录的小知识点。 - Rad Aragón

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接