【发布时间】:2018-12-15 01:34:37
【问题描述】:
在我的项目中,有在 AWS API Gateway 和 AWS Lambda 上实施的 REST API。由于 AWS Lambda 函数在我们调用它时是无服务器且无状态的,因此 AWS 使用处理我们调用的 Lambda 函数代码启动一个容器。根据AWS documentation,在 lambda 函数执行完成后,AWS 不会停止容器,我们可以在该容器中处理下一个调用。这种方法提高了服务的性能 - 只有在第一次调用 AWS 时才花时间启动容器(Lambda 函数的冷启动),并且所有下一次调用的执行速度更快,因为它们使用相同的容器(热启动)。
作为提高性能的下一步,我们创建了 cron 作业,它定期调用我们的 Lambda 函数(为此我们使用 Cloudwatch 规则)。这种方法允许保持 Lambda 函数“温暖”,从而避免容器的停止和重新启动。 IE。当真正的用户调用我们的 REST API 时,Lambda 不会花时间去启动一个新的容器。
但是我们遇到了这个问题 - 这种方法只允许保温一个 Lambda 函数容器,而来自不同用户的实际并行调用数量可能要大得多(在我们的例子中是数百个,有时甚至是数千个用户)。有没有办法为 Lambda 函数实现预热功能,不仅可以加热单个容器,还可以加热一些所需数量的容器?
我知道这种方法会影响 Lambda 函数的使用成本,并且可能使用好的旧应用程序服务器会更好,但我认为下一步将是比较这些方法及其成本,并且在当前时刻,我只想找到方法来加热所需的 Lambda 函数容器数量。
【问题讨论】:
-
不幸的是,没有太多关于这个主题的文档。如果我们相信 AWS Docs,AWS Lambda 容器每个容器一次只能处理一个事件(如果我误解了,请纠正我)。如果你有一个单一的 cron lambda 函数,它同时向你的 API Lambda 函数发送 6 个事件,我猜它会到达 6 个不同的 lambda 容器。如果您认为值得一试,请告诉我您的发现。
-
@TomNijs 你是对的。单个容器永远不会处理多个并发调用。
-
您是否检查过您实际获得了多少冷启动?如果您通常会同时调用 API,则应该同时有多个“暖”容器。
-
@GlebKosteiko 都是正确的;这是一个术语问题:容器经常被重用,但“重用”并不意味着函数的多个调用同时(同时)在给定容器中运行。如果,为了说明,你有一个需要 15 秒的函数,你现在和一分钟后调用它(没有其他东西在调用它),那么它很可能两次都在同一个容器中运行。但是如果你在 5 秒后一次又一次地运行它,这两个调用将永远不会在同一个容器中。重用不重叠。
-
在问题的边缘,你使用什么语言,你分配了多少内存?有些语言的启动速度比其他语言慢得多(Java),所以如果您愿意为一些改进的性能付出代价,您有时可以通过增加内存来减少冷启动时间,因为这会将可用的 CPU 周期增加大致相同的因素。 . 例如从 128MB 更改为 512MB 也意味着获得 4 倍的 CPU 量,即使您实际上并不需要更多内存,而且增加的内存不会直接改变性能。如果不需要,不使用 VPC 也有帮助。
标签: performance amazon-web-services aws-lambda amazon-cloudwatch cold-start