AWS Lambda中是否存在类似Request Scoped的节点?

时间:2018-01-30 15:58:35

标签: node.js amazon-web-services lambda

AWS Lambda(带有node.js)中是否存在请求安全的范围?这可以是全局可见的,但不会被另一个可能的传入lambda事件改变? 例如,现在我有这样的事情:

module.exports.handler = (event, context, callback) => {
    dependency.doSomething(event.info)
}

const doSomething = info => {
    anotherLib(info)
}

const anotherLib = info => {
    placeWhereIReallyNeedInfo(info)
}

我想做这样的事情:

module.exports.handler = (event, context, callback) => {
    global.info = event.info
    dependency.doSomething()
}

const doSomething = () => {
    anotherLib()
}

const anotherLib = () => {
    placeWhereIReallyNeedInfo(global.info)
}

但是在调用global.info之前,另一个lambda事件可能会覆盖anotherLib。当我有许多不同的文件和异步代码并且需要保持函数不需要的传递参数时,这尤其成问题。

提前致谢

3 个答案:

答案 0 :(得分:1)

在寻找相同的答案时,我在AWS上发现了以下Q / A声明。

  

问:AWS Lambda会重用函数实例吗?

     

为了提高性能,AWS Lambda可以选择保留您的函数实例并重复使用它来提供后续请求,而不是创建新副本。要了解有关Lambda如何重用函数实例的更多信息,请访问我们的文档。你的代码不应该假设这总是会发生。

来源:https://aws.amazon.com/lambda/faqs/

这让我相信只要AWS的算法说它应该,一个实例就可以继续运行。可能保持全局可访问下一个请求。

修改

这位技术博主的测试结果(与我无关)似乎提供了以下证据: https://www.trek10.com/blog/stateless/

答案 1 :(得分:0)

在这种情况下,恐怕accepted answer实际上是错误的。 AWS将重用函数实例,这意味着可以从一次调用到下一次调用保留全局状态。有关何时使用AWS Lambda架构encountered in production的示例,请参见以下博客文章。

您应该避免在lambda函数中依赖任何可变的全局状态。

但是,如果您对探索替代方法感兴趣,则有可能使用Node的Async Hooks API,以便将状态从一个异步事件传递到另一个异步事件,而无需使用全局变量。我提供了outline code for this approach in a recent blog post

答案 2 :(得分:-1)

  

但是另一个lambda事件可以在调用anotherLib之前覆盖global.info。

这实际上是Lambda函数中的一个非问题。它永远不会发生在设计上。

每个容器中一次只能运行一次的函数调用。全局范围在Lambda函数代码中是完全安全的。

如果一个函数调用正在运行而另一个函数调用需要启动,它将始终毫无例外地在一个完全不同的容器中运行,而不是任何其他当前运行的函数。在第一次调用完成之前,容器不会被重用于该函数的另一次调用。

随着并发性的增加,会自动创建新容器。当一个容器在没有足够流量的情况下存在几分钟以证明其存在时,它会被服务自动销毁。

这允许各种感觉有点脏但又方便且安全的东西,比如创建一个全局的“存储”对象而不是传递值。

当您记得为每个函数调用支付每n千兆字节毫秒的费用时,这是有道理的,以便独占使用正在运行的容器。