我正在使用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
进行某种操作?
答案 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(或至少是标准做法)要求在开头而不是代码中间使用模块。