Javascript Lambda/Serverless内联要求与标头要求 背景

Javascript Lambda/Serverless内联要求与标头要求 背景,javascript,node.js,memory,aws-lambda,serverless-framework,Javascript,Node.js,Memory,Aws Lambda,Serverless Framework,我正在使用AWS Lambda和API网关构建一个API。我没有将每个API端点拆分为单独的lambda函数,而是将它们包装到单个库中,并使用aws serverless express库 问题: 考虑到在单个Lambda执行中只能使用整个API的一部分,从内存利用率的角度(为了降低成本)来看,以下两者之间是否存在差异: var myModule=require(“myModule”); ... 函数handleSomething1() { myModule.doSomething(); } 函

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

问题: 考虑到在单个Lambda执行中只能使用整个API的一部分,从内存利用率的角度(为了降低成本)来看,以下两者之间是否存在差异:

var myModule=require(“myModule”);
...
函数handleSomething1()
{
myModule.doSomething();
}
函数handleSomething2()
{
...
}

函数handleSomething()
{
要求(“mymodule”).doSomething();
}
函数handleSomething2()
{
...
}
因此,例如,单个API请求可能导致在Lambda函数关闭之前只调用
handleSomething2
。在这种情况下,我们调用
var myModule=require(“myModule”)是否有效地浪费了内存顶部


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

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

即使对于Lambda的上下文,这也保持不变,因为如果在函数外部定义“require”,它将在Lambda冷启动时启动,而不会在后续热启动调用中重新运行

有关Lambda容器重用的详细信息。

require()
是一种同步操作,可重复使用。在您的示例中,如果未执行该函数,则不会将模块添加到内存中


你可以用你的策略来减少内存的使用,但是这会很重要吗?请小心使用,因为节点中的(或至少是标准的做法)是在开始时而不是在代码的中间需要模块。

你的意思是:<代码>它将在LAMBDA冷启动时启动,而不是在随后的热启动调用< /代码>中重新运行。节点缓存请求,但Lambda是无状态的。每次执行(冷或热)都是在事先不知道的情况下运行的,因此require将在冷和热运行时启动。当调用lambda函数时,它将加载到容器中,处理程序外部的代码将启动,然后触发处理程序。在处理初始请求并等待进一步请求后,Lambda函数将再运行约5分钟。如果一个新的请求在一段时间内到达,它将只在处理函数中运行代码。你在哪里看到5分钟部分?据我所知,Lambda函数将尽快停止。我相信5分钟是允许单个处理程序运行的最长时间,但在大多数情况下,当没有什么事情可做时,它将立即停止。调用回调后,Lambda函数的计费将立即停止,但Lambda函数将在后面(热)运行,以便它可以处理另一个请求。查看以下Stackoverflow Q/A了解更多有趣的信息。他确实说过“……可能长达5分钟”。但根据我的经验,它通常要短得多。我想知道这是否与您为其分配的RAM数量有关。我想您所说的“在您的示例中”是指第二个?我知道最佳实践是在一开始就需要模块,但最佳实践是在无服务器架构普及之前开发的。我想接下来的问题可能是:在考虑在Lambda上运行node.js时,是否需要更新最佳实践?是的,我指的是第二个示例;是的,在无服务器环境中,许多事情都会发生变化,包括可以被视为最佳实践的内容。但是,我仍然希望读取文件顶部带有requires的Node.js代码,这样我就知道所有同步请求都在哪里完成,并且知道文件的其余部分将只执行异步请求。正如我所说的,您可以使用此策略来避免加载不必要的代码,但请确认它是否真的会产生任何影响,并且这是一个不错的微优化案例。