Lambda /无服务器内联需要与标头需要

时间:2017-07-20 18:49:54

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

背景

我正在使用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进行某种操作?

2 个答案:

答案 0 :(得分:1)

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

即使对于Lambda的上下文,这仍然是相同的,因为如果在函数外定义'require',它将在Lambda的冷启动时启动,而不是为后续的Hot start调用重新运行。

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

答案 1 :(得分:0)

{{1}}是happens in the moment that it is executed的同步操作。在您的示例中,如果未执行该功能,则该模块将不会添加到内存中。

您可以通过策略减少内存使用量,但它会显着吗?谨慎使用not worry too much micro-optimizations,因为Node中的best practice(或至少是标准做法)要求在开头而不是代码中间使用模块。