【发布时间】:2020-09-02 04:41:24
【问题描述】:
在我们的应用程序(.net core)中有一个复杂的面向 CPU 的算法。每次执行通常需要 2-3 分钟。现在我们在后台服务中顺序执行它。因此,我们每小时只能管理大约 25 次成功执行,这在需求量很大的情况下是不够的。鉴于这是一项高度面向 CPU 的工作,因此在多个线程中执行也无济于事。事实上,多线程的结果更糟。
所以我想到了使用 AWS Lambdas。所以我创建了一个能够执行逻辑的 Lambda 函数,它由 AWS SQS 触发。因此,每当我需要执行逻辑时,都会将一条消息推送到队列中,然后 Lambda 会挑选并执行它。
当只有一个请求时,Lambda 每次执行也需要 2-3 分钟,这没关系。为了以防万一,我将 Lambda 的超时时间设置为 15 分钟。
但是,当有大量请求(例如:1000 个 5 分钟)时,问题就开始了。正如预期的那样,Lambda 增加了实例的数量。但这最终会降低所有实例的性能。事实上,几乎所有人都无法在 15 分钟的超时时间内完成工作。
因此,我假设 Lambda 的所有并行实例都分布在一台/几台 PC 中,它们共享相同/少数几个 CPU,最终模拟了我最初使用多线程的情况。与我最初的想法相反,每个实例都配置了内存(分配了 512 MB。它通常需要少于 180MB)和足够的 CPU。
封装大小为 15Mb。由于冷启动时间对我来说不是一个大问题,所以我认为预置并发也不会帮助我(不确定)。此外,它需要配置一个特定的版本,这将在后续部署过程中增加很多麻烦。
我希望问题很清楚。有没有人遇到过这样的事情或知道如何克服这个问题?
谢谢。
【问题讨论】:
-
你能澄清一件事吗?如果您在 SQS 中有一条消息,它会运行得很快。但是如果你有很多,它的速度很慢吗?所以你的函数在后一种情况下可能会获取 10 条消息,然后 lambda 在循环中处理它们?
-
你的功能是否正常。依赖一些外部 API 或数据库?也许瓶颈不是 lambda,而是它使用的东西?例如,如果一个函数。调用外部 api 它工作得很快。但是如果你有 1000 个函数同时调用同一个 api,它会阻塞 api 服务器,导致你的函数等待很长时间才能响应?
-
@Marcin:是的。与 Postgres 数据库通信。一次执行会进行几次读取和写入。一个问题:将保留并发设置为 10 之类的值可以保证一次只有 10 个实例?
-
是的。您可以使用保留并发设置限制并发 lambda 调用的数量。检查分贝。似乎它可能会阻塞在 1000 次并发读取和写入以下?
-
对于fifo,仅在同一组(消息组ID)内才能确保排序。因此,如果您有 5 个组,则只有 5 个并发 lambda 会处理它们(每组一个)。
标签: amazon-web-services .net-core aws-lambda amazon-sqs