首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >AWS lambda和Java并发

AWS lambda和Java并发
EN

Stack Overflow用户
提问于 2016-06-24 23:13:42
回答 3查看 18.2K关注 0票数 55

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

为了提高性能,AWS Lambda可能会选择保留您的函数的一个实例,并重用它来为后续请求提供服务,而不是创建新的副本。您的代码不应该假设这种情况总是会发生。

问题是关于Java并发性。如果我有一个处理程序的类,比如:

public class MyHandler {
    private Foo foo;
    public void handler(Map<String,String> request, Context context) {
       ...
    }
}

那么,在这里访问和使用对象变量foo是否是线程安全的呢?

换句话说: AWS lambda可以为不同的调用同时使用相同的对象吗?

API函数是在基于事件的源上处理的,特别是由方法调用。

EDIT-2当你想要实现某种到外部资源的连接池时,就会出现这样的问题,所以我想把到外部资源的连接作为一个对象变量。它实际上可以像预期的那样工作,但是我害怕并发问题。

编辑-3更具体地说,我想知道: AWS lambda的处理程序的实例是否可以共享公共堆(内存)或不共享

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-27 01:33:40

AWS lambda可以为不同的调用同时使用相同的对象吗?

AWS lambda处理程序的实例是否可以共享公共堆(内存)?

一个强有力的,明确的否定。AWS Lambda处理程序的实例甚至不能共享文件(在/tmp中)。

AWS Lambda容器不能被重用于两个或更多并发存在的Lambda函数调用,因为这将打破隔离要求:

Q: How does AWS Lambda isolate my code?

每个AWS Lambda函数都在自己的隔离环境中运行,具有自己的资源和文件系统视图。

how lambda functions work官方描述中的部分“AWS Lambda如何运行我的代码?容器模型”指出:

在执行Lambda函数后,AWS Lambda会在一段时间内维护容器,以期待另一个Lambda函数调用。实际上,如果再次调用Lambda函数时AWS Lambda选择重用容器,则服务将在Lambda函数完成后冻结容器,并解冻容器以供重用。这种容器重用方法具有以下含义:

  • 您的Lambda函数代码中的任何声明都将保持初始化状态,从而在再次调用该函数时提供额外的优化。例如,如果您的Lambda函数建立了数据库连接,则在后续调用中将使用原始连接,而不是重新建立连接。您可以在代码中添加逻辑,以在创建one.

之前检查连接是否已存在

  • 每个容器都在/tmp目录中提供了一些磁盘空间。当容器被冻结时,目录内容仍然存在,提供了可用于多次调用的临时缓存。您可以添加额外的代码来检查缓存中是否包含您存储的数据。

如果您的Lambda函数选择重用容器,则在函数结束时未完成的

  • 后台进程或回调将继续执行。您应该确保在代码退出之前,代码中的任何后台进程或回调(如果是Node.js)都已完成。

正如您所看到的,当尝试利用容器重用时,绝对没有关于Lambda函数的多个并发调用之间的竞争条件的警告。唯一的注意事项是“不要依赖它!”。

票数 76
EN

Stack Overflow用户

发布于 2019-06-26 08:39:44

在使用AWS Lambda时,利用执行上下文重用绝对是一种实践(请参阅AWS Lambda Best Practices)。但这不适用于并发执行,因为对于并发执行,会创建一个新的容器,从而创建新的上下文。简而言之,对于并发执行,如果一个处理程序更改了值,另一个处理程序将不会获得新值。

票数 0
EN

Stack Overflow用户

发布于 2021-04-21 22:49:41

正如我所看到的,Lambda没有并发问题。只有一个调用“拥有”容器。第二次调用将获得另一个容器(或者可能必须等到第一个容器变为空闲)。

但是我没有找到任何保证Java内存可见性问题不会发生的保证。在这种情况下,第一次调用所做的更改可能对第二次调用不可见。或者,第一次调用的更改将在第二次调用所做的更改之后写入RAM。

在大多数情况下,可见性问题的处理方式与并发问题的处理方式相同。因此,我建议开发线程安全(或同步)的Lambda函数。至少只要AWS不会给我们保证,他们会在每次调用后做一些事情来将CPU状态刷新到内存中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38016683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档