【发布时间】:2019-01-28 07:38:21
【问题描述】:
我已经搜索过任何答案,但我读到的所有内容都是关于并发 lambda 执行和 Node 中的 async 关键字语法,但是我找不到关于 lambda 实例执行的信息。
这是因为我在一次聚会上,有人提到 lambda 实例(即由 AWS 托管的包含我的代码的临时容器)一次只能执行一个请求。这意味着,如果我有 5 个请求进来(为了简单起见,让我们说一个已经很温暖的实例)它们都将在一个单独的实例中运行,即在 5 个单独的容器中。
对我来说,香蕉的事情是,这破坏了异步编程多年的发展。从 2009 年开始,node.js 普及了 i/o 编程,考虑到对于磨机 CRUD 应用程序的无聊运行,您的大部分请求时间都花在等待外部数据库调用或其他东西上。编写异步代码允许单个执行线程看似执行许多同时请求。虽然 node 没有发明它,但我认为可以公平地说它普及了它,并且在过去十年中一直是后端技术发展的巨大推动力。许多语言添加了使异步编程更容易的功能(回调/任务/承诺/未来或任何您想调用的语言),并且 Web 服务器已从每个请求的单个线程转移到基于事件循环(节点、顶点、红隼等)往年的模型。
无论如何,历史课已经足够了,我的观点是,如果我所听到的是真的,那么使用 lambdas 开发将把大部分内容抛到窗外。如果 lambda 运行时永远不会通过我正在运行的实例发送多个请求,那么以异步方式编程只会浪费资源。例如,我在说 C#,而我的 lambda 用于检索小部件。那么这段代码var response = await db.GetWidgets() 实际上效率很低,因为它将当前线程上下文推入堆栈,因此它可以允许其他代码在等待该调用返回时执行。由于在原始请求完成之前不会调用其他请求,因此以同步方式编程更有意义,除了可以进行并行调用的地方。
这是正确的吗?
如果是这样,我真的很震惊,它没有被更多地讨论。我在过去几年中看到了异步编程的范式转变,这完全改变了这一点。
TL;DR:lambda 真的只允许每个实例一次执行一个请求吗?如果是这样,这将结束服务器开发向异步代码的重大转变。
【问题讨论】:
-
如答案所示,所有 lambda 运行时一次只能处理一次执行。但是,使用自定义运行时,您可以通过在第一次执行完成之前再次调用下一次调用 API 来同时处理多个请求。我很想知道这是否有效。 docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html
标签: amazon-web-services asynchronous concurrency aws-lambda