【问题标题】:Lambda/Serverless inline require vs. header requireLambda/无服务器内联要求与标头要求
【发布时间】:2017-07-21 09:17:28
【问题描述】:

背景

我正在使用 AWS Lambda 和 API Gateway 构建 API。我没有将每个 API 端点拆分为单独的 lambda 函数,而是将它们包装到一个库中并使用 aws-serverless-express 库。

问题

鉴于整个 API 的一部分可能会在单个 Lambda 执行中使用——从内存利用率的角度来看(以降低成本):

var myModule = require("mymodule");

...

function handleSomething1()
{
    myModule.doSomething();
}

function handleSomething2()
{
    ...
}

function handleSomething()
{
    require("mymodule").doSomething();
}

function handleSomething2()
{
    ...
}

因此,例如,单个 API 请求可能会导致在 Lambda 函数关闭之前仅调用 handleSomething2。在那种情况下,我们是否通过调用var myModule = require("mymodule"); 来有效地浪费内存?

我想更直接的问题是,当我var myModule = require("mymodule") 时,node.js 运行时是否真的为myModule 分配了内存?或者在我真正 myModule 之前,它实际上是一个无操作?

【问题讨论】:

    标签: javascript node.js memory aws-lambda serverless-framework


    【解决方案1】:

    您应该始终在 Node.js 中使用异步方法和函数调用。然而 Node.js 总是同步运行 require 并且需要的模块可能需要其他需要的模块,这是一个昂贵的过程。

    即使对于 Lambda 的上下文,这仍然是相同的,因为如果您在函数之外定义“require”,它将在 Lambda 的冷启动时启动,并且不会为后续的热启动调用重新运行。

    更多关于 Lambda 容器重用的信息reference

    【讨论】:

    • it will be initiated upon Cold start of Lambda and not re-run for subsequent Hot start calls 是什么意思? Node 缓存 require,但 Lambda 是无状态的。每次执行(冷或热)在事先不知道的情况下运行,因此将在冷热运行时启动。
    • 当一个 lambda 函数被调用时,它会加载到一个容器中,并且在处理程序之外的代码将被启动,然后触发处理程序。处理初始请求后,Lambda 函数将继续运行约 5 分钟,等待进一步的请求。如果在这段时间内有新请求,它只会运行处理函数内的代码。
    • 您在哪里看到 5 分钟部分?据我了解,Lambda 函数将尽快停止。我相信 5 分钟是允许单个处理程序运行的最长时间,但在大多数情况下,它会在无事可做时立即停止。
    • 调用回调后,Lambda 函数的计费将立即停止,但 Lambda 函数将在后面运行 (HOT),以便它可以处理另一个请求。查看以下 Stackoverflow Q/A 了解更多信息stackoverflow.com/questions/34216248/…
    • 有趣。他确实说“……可能长达 5 分钟”。但根据我的经验,它通常要短得多。我想知道这是否与您为其分配的 RAM 量有关。
    【解决方案2】:

    require()happens in the moment that it is executed 的同步操作。在你的例子中,如果函数没有被执行,那么模块将不会被添加到内存中。

    您可以通过您的策略减少内存使用量,但这会很重要吗?小心 not worry too muchmicro-optimizations 因为 Node 中的 best practice(或至少是标准做法)是在代码的开头而不是在代码中间需要模块。

    【讨论】:

    • “在你的例子中”我假设你的意思是第二个?我知道最佳实践是在一开始就需要模块,但最佳实践是在无服务器架构普及之前开发的。我想后续问题可能是:在考虑在 Lambda 上运行 node.js 时,是否需要更新最佳实践?
    • 是的,我指的是第二个例子;是的,在无服务器上下文中,许多事情都会发生变化,包括可以被视为最佳实践的内容。但是,我仍然希望读取文件顶部带有要求的 Node.js 代码,因此我知道所有同步请求在哪里完成,并且知道文件的其余部分将只执行异步请求。就像我说的,你可以使用这个策略来避免加载不必要的代码,但要确认它是否真的会产生任何影响,这不是一个微优化的坏案例。
    猜你喜欢
    • 1970-01-01
    • 2011-01-06
    • 2011-05-23
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多