Java AWS Lambda的并发行为

Java AWS Lambda的并发行为,java,concurrency,aws-lambda,Java,Concurrency,Aws Lambda,假设我有这样一个代码 public class MyHandler { private Foo foo; public void handler(InputStream request, OutputStream response, Context context) { ... } } Foo-Foo负责创建池数据库连接 我试图了解这是如何与AWS Lambda一起工作的。如果我理解正确,foo将在多个调用中共享。第一个需要更多的时间,因为它必须加载到容器

假设我有这样一个代码

public class MyHandler {
    private Foo foo;
    public void handler(InputStream request, OutputStream response, Context context) {
       ...
    }
}
Foo-Foo负责创建池数据库连接

我试图了解这是如何与AWS Lambda一起工作的。如果我理解正确,foo将在多个调用中共享。第一个需要更多的时间,因为它必须加载到容器中,而后续的会更快,因为foo已经初始化。直到我的处理程序在一段时间的不活动后被踢出,情况才会如此

那么,对于顺序调用,它会使用相同的对象吗?它会访问在前面的函数调用中创建的/tmp吗

并行调用呢?它会复制整个容器吗?因为根据文档,每个lambda函数都应该在自己的容器、自己的资源和自己的/tmp中执行

如果处理程序在不活动后将被踢出,Java中是否有回调函数,我可以调用它来关闭所有打开的池连接

那么,对于顺序调用,它会使用相同的对象吗 是否有权访问先前函数调用中创建的/tmp

是的,它将使用相同的对象。是的,它可以访问在前面的函数调用中创建的
/tmp

并行调用呢?它会复制整个系统吗 容器,因为根据文档,每个lambda函数 在自己的容器、自己的资源和自己的/tmp中执行

并行调用将在单独的容器中进行。单个容器一次只处理一个调用。因此,是的,整个容器将被复制,每个容器都有自己的
/tmp

如果处理程序在不活动后将被踢出,是否存在 Java中的回调函数,我可以调用它来关闭所有打开的 共用连接


不,您无法使用回调来处理此问题。当容器最终由于不活动而被删除时,函数将处于挂起状态

因此,在并行调用的情况下,当容器发生复制时,通常会有创建数据库连接的开销?这意味着,为AWS Lambda创建池连接是没有用的?如果并行执行中没有足够的容器已经启动,那么会有为创建的新容器创建数据库连接的开销。如果您在一段时间内继续进行并行调用,那么这些容器将被重用,这意味着有很好的理由在处理程序外部创建DB连接。但是,如果您在Lambda函数中使用连接池,我认为您只希望池的大小为1。谢谢。这就把事情弄清楚了。基本上,它类似于创建到DB的直接连接,而不是池连接。如果我理解正确,则无法保证第二次调用将通过并行环境中的第一次调用访问存储在
/tmp
中的数据,即使这两次调用是连续的。想知道
/tmp
的真实用例是否正确,这是无法保证的。如果真实稳定的用例只用于一次调用,我们为什么要使用
/tmp