繁体   English   中英

AWS lambda 和 Java 并发

[英]AWS lambda and Java concurrency

众所周知,AWS lambda可能会重用早期创建的处理程序对象,它确实做到了(请参阅常见问题解答):

问: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当您想实现某种与外部资源的连接池时,会出现此类问题,因此我想将与外部资源的连接保持为对象变量。 它实际上按预期工作,但我担心并发问题。

EDIT-3更具体地说,我想知道: AWS lambda 的处理程序实例是否可以共享公共堆(内存) 我必须指定这个额外的细节,以防止列出关于 java 线程安全对象的明显和常见的事情的答案。

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

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

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

一个 AWS Lambda 容器不能被重复用于两个或多个同时存在的 Lambda 函数调用,因为这会破坏隔离要求:

问:AWS Lambda 如何隔离我的代码?

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

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

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

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

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

  • 如果 AWS Lambda 选择重用容器,则由您的 Lambda 函数启动但在函数结束时未完成的后台进程或回调将恢复。 在代码退出之前,您应该确保代码中的任何后台进程或回调(在 Node.js 的情况下)都已完成。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM