Lambda /无服务器内联需求与头部需求

背景

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

鉴于从内存使用的angular度来看,只有一部分整个API可以用于单个Lambda执行(为了降低成本),在以下几点之间还是有区别的:

 var myModule = require("mymodule"); ... function handleSomething1() { myModule.doSomething(); } function handleSomething2() { ... } 

要么

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

因此,举例来说,一个API请求可能会导致在handleSomething2 Lambda函数之前,只handleSomething2 。 在这种情况下,我们通过调用var myModule = require("mymodule");有效地浪费内存var myModule = require("mymodule"); 顶部?

我想更直接的问题是,当我var myModule = require("mymodule")是否node.js运行时真的为myModule分配内存在那一刻? 或者,直到我真的用myModule 做了什么之后,它才真正成为一个myModule

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

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

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

require()是在执行时发生的同步操作。 在你的例子中,如果函数没有被执行,那么模块将不会被添加到内存中。

你可以减less内存使用与你的策略,但它会很重要? 小心不要过于担心 微观优化,因为Node中的最佳实践 (或者至less是标准实践)是在开始时而不是在代码中间要求模块。