我已经找到了所有答案,但我读到的所有内容都是关于并发lambda执行和Node中的async关键字语法,但是我找不到关于lambda实例执行的信息。
这是因为我在一个聚会上,有人提到lambda实例(即包含我的代码的AWS托管的临时容器)一次只能执行一个请求。这意味着如果我有5个请求进来(为了简单起见,让我们假设一个已经热的实例),它们都将在一个单独的实例中运行,即在5个单独的容器中运行。
对我来说,香蕉的事情是,这破坏了异步编程多年的发展。从2009年开始,node.js普及了i/o编程,考虑到对于冗长的CRUD应用程序的无聊运行,您的大部分请求时间都花在等待外部DB调用或其他事情上。通过编写异步代码,单个执行线程似乎可以同时执行多个请求。虽然node不是它的发明者,但我认为公平地说,它普及了它,并且在过去十年里一直是后端技术发展的巨大驱动力。许多语言都添加了一些功能来简化异步编程(回调/任务/承诺/未来或你想叫它们的任何东西),web服务器也从去年的每请求单线程模型转移到基于事件循环的(node,vertx,kestrel等)。
无论如何,受够了历史课,我的观点是,如果我听到的是真的,那么使用lambdas进行开发就会把大部分都抛在脑后。如果lambda运行时永远不会通过我正在运行的实例发送多个请求,那么以异步方式进行编程只会浪费资源。比方说,我说的是C#,我的lambda是用来检索小部件的。那么这个代码var response = await db.GetWidgets()实际上是低效的,因为它将当前的线程上下文推送到堆栈上,以便在等待调用返回时允许其他代码执行。由于在原始请求完成之前不会调用任何其他请求,因此以同步样式编程更有意义,除了可以进行并行调用的地方。
这是正确的吗?
如果是这样的话,我真的很震惊,没有更多的讨论。在过去的几年里,我看到异步编程有了范式的转变,这完全改变了这一点。
TL;DR: lambda真的只允许每个实例一次执行一个请求吗?如果是这样的话,这将结束服务器开发向异步代码的主要转变。
发布于 2018-10-31 23:50:50
是的,你是对的- Lambda会启动多个容器来处理并发请求,即使你的Lambda异步地做了一些工作(我已经通过我自己的经验证实了这一点,许多其他人也观察到了同样的行为-参见类似问题的this answer )。对于每个支持的运行时(C#、Node.js等),都是如此。
这意味着您的Lambda函数中的异步代码不会允许一个Lambda容器同时处理多个请求,正如您所说的那样。尽管如此,你仍然可以获得异步代码的所有其他好处,并且仍然可以通过例如同时进行许多异步web服务或数据库调用来提高Lambda的性能-因此Lambda的这一特性不会使异步编程在平台上变得无用。
发布于 2018-11-01 00:27:41
你的问题是:
因为在原始请求完成之前不会调用其他请求,所以除了可以进行并行调用的地方之外,以同步方式编程更有意义。
不是,因为您不再需要等待答案,因为如果您使用同步进程,则应该等待答案。您的触发器本身必须在调用后终止,因此它将释放内存。要么lamba发送通知,要么一旦完成就触发新服务,或者观察者查看结果值(可以用sync lambda等待答案,但由于lambda系统本身下面的底层异步过程,这是不准确的)。作为一名Android开发人员,您可以将其与intent和broadcast进行比较,它完全是异步的。
这是一种完全不同的设计解决方案的方式,因为异步机制必须在工作流层本身进行管理,而不再是应用程序的核心,解决方案变成了触发微服务的通知器/观察器的聚合,它不再是数千行代码的单个二进制代码。
每个lambda函数必须是一个单独的微服务。
回到处理繁忙的流量,你可以并行运行数百万个Lambda,只要你的微服务快速结束,它不会花费太多。为了确保您的工作流不会丢失任何内容,您可以在解决方案中添加SQS (队列消息传递)。
发布于 2021-05-23 22:15:54
有关the above answer的更多信息,请参阅here。据我所知,这是一个同步循环。因此,从请求处理的角度来看,使事情异步的唯一方法是将工作委托给消息队列,例如SQS,就像编写的here一样。我认为这类似于如何使用芹菜来使Django异步。最后,如果您真的希望在node.js/python/c#/c++中异步处理请求,如果您可能需要使用AWS Fargate / EC2而不是Lambda。否则,在Lambda中,正如您提到的那样,这确实是一件很简单的事情。另一方面,对于高流量,async/await显示了它的好处,Lambda不是一个很好的选择。关于ec2、Lambda和Fargate这三个服务,有一个盈亏平衡分析here。
https://stackoverflow.com/questions/51960136
复制相似问题