AWS Lambda 异步代码执行

Pie*_*ald 6 concurrency asynchronous amazon-web-services aws-lambda

我已经搜索过任何答案,但我读到的所有内容都是关于asyncNode 中的并发 lambda 执行和关键字语法,但是我找不到有关 lambda 实例执行的信息。

这是因为我在一次聚会上,有人提到 lambda 实例(即由 AWS 托管的包含我的代码的临时容器)一次只能执行一个请求。这意味着如果我有 5 个请求进来(为了简单起见,让我们说一个已经热的实例)它们都将在一个单独的实例中运行,即在 5 个单独的容器中。

对我来说,香蕉的事情是这破坏了异步编程多年的发展。从 2009 年开始,node.js 开始普及 i/o 编程,因为对于 Mill CRUD 应用程序的无聊运行,您的大部分请求时间都花在等待外部数据库调用或其他事情上。编写异步代码允许单个执行线程看似同时执行多个请求。虽然 node 没有发明它,但我认为可以说它普及了它,并且在过去十年中一直是后端技术发展的巨大推动力。许多语言都添加了一些特性来使异步编程更容易(回调/任务/承诺/未来或任何你想调用它们的东西),并且 web 服务器已经从每个请求的单个线程转移到基于事件循环(节点、顶点、kestrel 等)去年的模型。

无论如何,历史课已经足够了,我的观点是,如果我听到的是真的,那么使用 lambdas 进行开发会将大部分内容抛之脑后。如果 lambda 运行时永远不会通过我正在运行的实例发送多个请求,那么以异步方式编程只会浪费资源。比如说我在说 C#,而我的 lambda 是用于检索小部件。然后这段代码var response = await db.GetWidgets()实际上是低效的,因为它将当前线程上下文推送到堆栈上,因此它可以在等待该调用返回时允许其他代码执行。由于在原始请求完成之前不会调用其他请求,因此以同步样式编程更有意义,除了可以进行并行调用的地方。

这样对吗?

如果是这样,我真的很震惊,它没有被更多地讨论。我在过去几年中看到了异步编程的范式转变,这完全改变了这一点。

TL;DR:lambda 真的只允许每个实例一次执行一个请求吗?如果是这样,这将结束服务器开发向异步代码的重大转变。

Ken*_*ert 4

是的,你是对的 - Lambda 会启动多个容器来处理并发请求,即使你的 Lambda 异步执行一些工作(我已经通过自己的经验证实了这一点,并且许多其他人也观察到了相同的行为 - 请参阅类似的答案问题)。对于每个受支持的运行时(C#、Node.js 等)都是如此。

这意味着 Lambda 函数中的异步代码将不允许一个 Lambda 容器同时处理多个请求,如您所述。话虽这么说,您仍然可以获得异步代码的所有其他好处,并且仍然可以通过例如同时异步进行许多 Web 服务或数据库调用来提高 Lambda 的性能 - 因此 Lambda 的这一属性不会使异步编程变得无用在平台上。