【问题标题】:AWS Lamba with poor performance when using RDS使用 RDS 时性能不佳的 AWS Lambda
【发布时间】:2017-02-16 22:22:05
【问题描述】:

我已经使用无服务器框架实现了一个 AWS Lambda 函数。该 Lambda 函数正在使用 RDS 和 MongoDB。 MongoDB 端点运行大约 500 毫秒,但 RDS 运行时间为 12 秒(冷启动)和约 3 秒(热启动)。

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

如何加快我的 RDS Lambda 端点?

【问题讨论】:

    标签: node.js aws-lambda amazon-rds serverless-framework serverless-architecture


    【解决方案1】:

    在函数模块定义后的第一行,添加以下行

    context.callbackWaitsForEmptyEventLoop = false;
    

    callbackWaitsForEmptyEventLoop

    • 默认值为真
    • 仅用于修改回调的默认行为。

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

    更多详情请阅读this文章

    【讨论】:

    • @alish,您已将此标记为正确答案。请分享它在性能方面的改进程度?你有 3 秒 - 12 秒,你现在有什么?
    • 在我的情况下,最初需要 7-8 秒。现在执行大约需要 2-3 秒。感谢您的解决方案。
    【解决方案2】:

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

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

    有趣的是:如果您使用 setTimeout 安排一个函数稍后运行,那么您有大约 15 秒的时间免费运行,因为 Lambda 只对显式异步函数调用负责。

    【讨论】:

    • 您有任何文件来支持您的回答吗?我找不到任何东西。我认为事件循环中留下的任何东西都会在下一次调用时运行。
    • 哪一部分?上下文函数是 AWS Lambda 编程模型 (docs.aws.amazon.com/lambda/latest/dg/…) 的一部分,但尽管它已经过时,但它仍然存在以实现向后兼容性,您可以测试这一点。 setTimeout 延迟是一个未记录的琐事。
    猜你喜欢
    • 1970-01-01
    • 2018-03-21
    • 2017-07-25
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 2021-11-26
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多