2017-06-17 124 views
3

假设我有这样的代码。AWS的并发行为Lambda

public class MyHandler { 
    private Foo foo; 
    public void handler(InputStream request, OutputStream response, Context context) { 
     ... 
    } 
} 

富富负责创建池数据库连接的服务。

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

因此,对于顺序调用,它是否会使用同一个对象,它是否可以访问早期函数调用中创建的/ tmp?

平行调用怎么样?它是否会复制整个容器,因为根据文档,每个lambda函数应该在它自己的容器,它自己的资源和它自己的/ tmp中执行?

如果处理程序将在闲置后被踢出,Java中是否有一个回调函数可以调用以关闭所有打开的池连接?

回答

1

因此,对于顺序调用,它是否会使用同一个对象,它是否可以访问在早期函数调用中创建的/ tmp?

是的,它会使用同一个对象。是的,它可以访问早期函数调用中创建的/tmp

平行调用怎么样?它会复制整个 容器,因为根据文档,每个lambda函数应该在其自己的容器中执行,它自己的资源和它自己的/ tmp?

并行调用将出现在单独的容器中。一个容器一次只能处理一个调用。所以是整个容器将被复制,并且每个容器都有自己的/tmp

如果处理程序会活动后,被踢出,有没有在Java中 回调函数,我可以打电话给关闭所有打开的 池连接?

不,没有回调可以用来处理这个问题。当容器由于不活动而最终被移除时,您的功能将处于暂停状态。

+0

因此,在并行调用的情况下,当容器发生重复时,通常会有创建数据库连接的开销?那意味着,为AWS Lambda创建池式连接没有用处? – Prabhat

+0

如果没有足够的容器已经启动的并行执行的情况下,是的,会创建一个新的容器创建数据库连接的开销。如果您在一段时间内继续使用并行调用,那么这些容器将被重用,这意味着在处理程序之外创建数据库连接有很好的理由。但是,如果您在Lambda函数内部使用连接池,我认为您只希望该池的大小为1. –

+0

谢谢。这清除了事情。基本上,它就像创建与数据库的直接连接而不是混合数据库。如果我的理解正确,则不能保证第二次调用将通过在并行环境中首次调用来访问存储在'/ tmp'中的数据,即使这两次调用是连续的。 想知道'/ tmp'的真实用例 – Prabhat